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中的匹配值大于随机均匀你得到的号码
原始答案,用于减法(在编辑问题之前):
对于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 和 @ 的值987654336@ 适合。