java случайные проценты - PullRequest
       18

java случайные проценты

18 голосов
/ 09 июня 2010

Мне нужно сгенерировать n процентов (целых чисел от 0 до 100), чтобы сумма всех n чисел составляла до 100.

Если я простоделайте nextInt() n раз, каждый раз гарантируя, что параметр равен 100 минус ранее накопленная сумма, тогда мои проценты смещены (т.е. первое сгенерированное число обычно будет наибольшим и т. д.).Как мне сделать это непредвзято?

Ответы [ 12 ]

0 голосов
/ 09 июня 2010

Первое, очевидное решение.

do
    int[] a = new int[n];
    for (int i = 0; i < n; ++i) {
        a[i] = random number between 0 and 100;
    }
until sum(a) == 100;

Он не идеален с точки зрения сложности (количество итераций для достижения суммы 100 может быть довольно большим), но распределение, безусловно, «беспристрастно».

редактировать
Аналогичная проблема: как сгенерировать случайную точку в окружности с радиусом 1 и центром в (0, 0)? Решение: продолжайте генерировать случайные точки в диапазоне (квадрат) [-1..1, -1..1], пока одна из них не поместится в круг:)

0 голосов
/ 09 июня 2010

После того, как вы выберете числа с помощью описанного вами метода, перетасуйте порядок чисел. Таким образом, окончательный список чисел имеет более равномерное распределение.

Однако, обратите внимание, что независимо от того, что вы делаете, вы не можете получить идеально равномерное распределение, поскольку после того, как вы начнете выбирать числа, ваши случайные испытания не станут независимыми. См. Ответ атайлора.

Обратите внимание, что описанный вами алгоритм может не дать вам требуемого результата. Последнее число не может быть случайным, поскольку оно должно равняться 100.

...