Учитывая массив размера n
Я хочу генерировать случайные вероятности для каждого индекса, таким образом что Sigma(a[0]..a[n-1])=1
Один возможный результат мог бы быть:
0 1 2 3 4
0.15 0.2 0.18 0.22 0.25
Другой совершенно легальный результат может быть:
0 1 2 3 4
0.01 0.01 0.96 0.01 0.01
Как я могу генерировать их легко и быстро? Ответы на любом языке прекрасны, предпочтенный Java.
Задача, которую вы пытаетесь решить, равнозначна нанесению случайной точки из симплекса N-мерной единицы.
http://en.wikipedia.org/wiki/Simplex#Random_sampling может помочь.
Наивное решение могло бы заключаться в следующем:
public static double[] getArray(int n)
{
double a[] = new double[n];
double s = 0.0d;
Random random = new Random();
for (int i = 0; i < n; i++)
{
a [i] = 1.0d - random.nextDouble();
a [i] = -1 * Math.log(a[i]);
s += a[i];
}
for (int i = 0; i < n; i++)
{
a [i] /= s;
}
return a;
}
Чтобы отрисовать точку равномерно из N-мерного элементарного симплекса, нужно взять вектор экспоненциально распределенных случайных величин, а затем нормализовать его по сумме этих величин. Для получения экспоненциально распределенного значения возьмем отрицательный log
равномерно распределенного значения.
Если вы хотите эффективно генерировать значения из нормального распределения, попробуйте преобразование поле Muller .
Получите случайные числа, рассчитайте их сумму и нормализуют сумму на 1, разделив каждое число с суммой.