#java #random #normal-distribution
#java #Случайный #нормальное распределение
Вопрос:
Я хочу сгенерировать N случайных удвоений, чтобы их сумма была равна 1.
Кроме того, N случайных удвоений должны подчиняться нормальному распределению.
Я понимаю nextGuassian()
Random
, что может генерировать нормальное распределенное число.
Но как достичь цели, указанной выше?
Комментарии:
1. Сгенерируйте N случайных удвоений, суммируйте их все и разделите каждое из них на сумму.
2. @jesper черт возьми, это умно. не могли бы вы написать свое в качестве ответа
3. Это довольно стандартная практика нормализации.
Ответ №1:
double[] generateNRandomDoublesWhichSumToOne(Random random, int n) {
if (random == null) throw new NullPointerException();
if (n <= 0) throw new IllegalArgumentException();
double[] values = new double[n];
double sum = 0;
for (int i = 0; i < n; i) {
values[i] = random.nextGaussian();
sum = values[i];
}
for (int i = 0; i < n; i) {
values[i] /= sum;
}
return values;
}
Комментарии:
1. Что, если N случайных удвоений должны быть равны нулю или положительны?
2. используйте @JacksonTale
Math.abs
. Обратите внимание, что вы больше не будете генерировать нормально распределенные значения.3. да, это моя точка зрения. если я использую
abs
, то это как половина нормально распределенного. В любом случае, чтобы переместить весь дистрибутив вправо на положительные значения?4. @JacksonTale как бы далеко вы ни меняли свое распределение, вы всегда можете получить отрицательное значение, это просто менее вероятно. Если вам нужны гарантированные неотрицательные значения, нормальное распределение — неправильный выбор.