p1 + p2 + ... + pn = 1
p1 = p2 * x
p2 = p3 * x
...
p_n-1 = pn * x
Решая это дает:
p1 + p2 + ... + pn = 1
(p2 * x) + (p3 * x) + ... + (pn * x) + pn = 1
((p3*x) * x) + ((p4*x) * x) + ... + ((p_n-1*x) * x) + pn = 1
....
pn* (x^(n-1) + x^(n-2) + ... +x^1 + x^0) = 1
pn*(1-x^n)/(1-x) = 1
pn = (1-x)/(1-x^n)
Это дает вероятность, что вам нужно установить на pn
, и из него можно вычислить вероятности для всех остальных p1, p2, ... p_n-1
Теперь вы можете использовать «черный ящик» RNG, который выбирает номер с дистрибутивом, как в упомянутых вами потоках.
Простой подход, чтобы сделать это, чтобы установить добавочному массив:
aux[i] = p1 + p2 + ... + pi
Теперь нарисуйте случайное число с равномерным распределением между 0
в aux[n]
, и с помощью бинарного поиска (Окс массив отсортирован), получаем первое значение, которое подходящее значение в aux
больше, чем случайное равномерном числа вы получили
Оригинальный ответ, за вычитанием (до вопрос Editted):
Для n
пунктов, вам нужно решить уравнение:
p1 + p2 + ... + pn = 1
p1 = p2 + x
p2 = p3 + x
...
p_n-1 = pn + x
Решая это дает:
p1 + p2 + ... + pn = 1
(p2 + x) + (p3 + x) + ... + (pn + x) + pn = 1
((p3+x) + x) + ((p4+x) + x) + ... + ((p_n-1+x) + x) + pn = 1
....
pn* ((n-1)x + (n-2)x + ... +x + 0) = 1
pn* x = n(n-1)/2
pn = n(n-1)/(2x)
Это дает вероятность, что вам нужно установить на pn
, и от него можно вычислить вероятности для всех остальных p1, p2, ... p_n-1
Теперь вы можете использовать «черный ящик» RNG, который выбирает число с распределением, например, в потоках ты упомянул.
Советуйте, это не гарантирует вам будет иметь решение, такое, что 0<p_i<1
для всех i
, но вы не можете гарантировать одно данное от ваших требований, и это будет зависеть от значений n
и x
, чтобы соответствовать ,
Я думаю, что вы имеете в виду «K | 0 <= к <= п». (Удалено остальное комментарий, что было неправильно.) –
@j_random_hacker да, tnx –
Вау, это действительно неясно. – pjs