Как использовать Random.nextGaussian() для генерации N удваивает эту сумму до 1

#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 как бы далеко вы ни меняли свое распределение, вы всегда можете получить отрицательное значение, это просто менее вероятно. Если вам нужны гарантированные неотрицательные значения, нормальное распределение — неправильный выбор.