我想以不相等的概率在两个选择之间随机选择*。
例如,当用户按下按钮时,25%的时间会产生声音A和75%的时间,声音B.我可以手动做简单的比例,如1:4和2:4,但我' m比例如3:5有问题。
考虑这个问题的一般方法是什么?
*我的意思是一个一个地看着不可预测。我发现任何问题 随机的单词得到一个 Mensa 悬挂物
答案 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();