如何以一定比例随机选择

时间:2010-12-02 03:41:47

标签: algorithm random probability

我想以不相等的概率在两个选择之间随机选择*。

例如,当用户按下按钮时,25%的时间会产生声音A和75%的时间,声音B.我可以手动做简单的比例,如1:4和2:4,但我' m比例如3:5有问题。

考虑这个问题的一般方法是什么?

  

*我的意思是一个一个地看着不可预测。我发现任何问题   随机的单词得到一个 Mensa   悬挂物

5 个答案:

答案 0 :(得分:5)

比例3:5相当于37.5%的时间或0.375(A的3倍,B的5倍,因此3/8为37.5%)。所以你可以像这样计算:

random() < 0.375 ? "A" : "B"

http://en.wikipedia.org/wiki/Ratio

  

如果有2个橙子和3个苹果,橙子与苹果的比例显示为2:3,而橙子与总水果的比例为2/5。

答案 1 :(得分:4)

对于3:5你可以将它们加在一起得到8,然后选择一个小于8的随机整数。如果它是0,1或2(三次机会)你选择A,如果它是3,4,5,您选择6或7(五次机会)B。代码方式您只需检查您的随机数是否小于3.

对于像3:5:4这样的东西,你会选择一个小于12(3 + 5 + 4)的随机数,如果它小于3你选择A,否则如果它小于8(3 + 5)你选择B,否则你选择C.

这可以概括为任意数量的替代方案,但由于必须针对每个阈值(即O(n))检查随机数,因此它具有许多替代方案的效率低下。 This SO question似乎为加权随机选择提供了一些更有效(但更复杂)的算法,并且有更多的替代选择。

答案 2 :(得分:3)

如果您可以访问0到1之间的统一随机数分布,则可以执行以下操作:

将比率转换为分数,因此比率将变为某个数字x。 (例如3:2将变为3/5或0.6) 从均匀[0,1]分布中取一个随机数y。 如果y < x选择第一个替代方案,否则选择第二个方案。

答案 3 :(得分:1)

假设您的随机数生成器返回0.0到1.0之间的双精度值,您只需要比较您想要的确切比率。如果是5分中的3分,则检查随机值是否小于0.6。

if(rand < 0.6) {
    playSound(A);
}
else {
    playSound(B);
}

答案 4 :(得分:1)

if (random() % (A+B) < A) 
   do_A() 
else
   do_B();