你描述的是一个多项过程.
http://en.wikipedia.org/wiki/Multinomial_distribution#Sampling_from_a_multinomial_distribution
他们生成这样的随机过程的方式是这样的:(我将使用伪代码,但它应该很容易进入实际代码.)
按照概率的相反顺序对"框"进行排序:( 不需要.它只是一个优化), 所以你有例如值= [0.45,0.3,0.15,0.1]
然后创建'累积'分布,它是索引<= i的所有元素的总和.伪代码:
cumulant=[0,0,0,0] // initiate it
s=0
for j=0 to size()-1 {
s=s+values[i] ;
cumulant[i]=s
}
Run Code Online (Sandbox Code Playgroud)
在我们的案例累积量= [0.45,0.70,0.85,1]
在0和1之间制作一个统一的随机数x.对于php:http://php.net/manual/en/function.rand.php
得到的随机盒索引i是
累积量[i] <x的最高i
伪代码:
for j=0 to size()-1 {
if !(cumulant[i]<){
print "your index is ",i
break;
}
Run Code Online (Sandbox Code Playgroud)
这就对了.通过回到第3点获得另一个随机索引.
如果您按照上面的建议排序,这意味着最终搜索会更快.例如,如果你有这个概率向量:0.001 0.001 0.001 0.001 0.996那么,当你对它进行排序时,你几乎总是只需要看索引i = 0,因为随机数x几乎总是低于0.996 .如果排序得到回报,取决于你是否反复使用相同的"盒子".所以,是的250k尝试它会有很大帮助.请记住,我得到的框索引是针对排序的向量.