Генерация распределения вероятностей

Учитывая массив размера 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.

18
задан trashgod 31 January 2010 в 19:18
поделиться

3 ответа

Задача, которую вы пытаетесь решить, равнозначна нанесению случайной точки из симплекса 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 равномерно распределенного значения.

16
ответ дан 30 November 2019 в 07:12
поделиться

Если вы хотите эффективно генерировать значения из нормального распределения, попробуйте преобразование поле Muller .

0
ответ дан 30 November 2019 в 07:12
поделиться

Получите случайные числа, рассчитайте их сумму и нормализуют сумму на 1, разделив каждое число с суммой.

22
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: