例如,我想从集合S = {0,1,2,3}获得随机数。但是,不是每个数字都有相同的概率(25%),现在我对每个数字的概率不同,比如说{50%,30%,20%,10%}。 我该如何编码呢?在Java或C#中(我更喜欢C#)。
答案 0 :(得分:2)
Alias方法是我最喜欢的。
http://code.activestate.com/recipes/576564-walkers-alias-method-for-random-objects-with-diffe/
我没有查看此代码,但它是google的最佳结果。
这是另一个更好的解释
http://pandasthumb.org/archives/2012/08/lab-notes-the-a.html
我实际上经常使用这个问题进行采访,因为如果你之前从未见过它,那就非常令人费解。
如果上面的内容太多而无法实现,那么通过输入解决方案就会有一个更简单的循环。
使用PHP,因为只显示代码更容易。
function getNumberFromDistribution($dist) {
$totalProbability = 0;
$randomNumber = mt_rand(0, mt_getrandmax()) / mt_getrandmax(); //uniform random number between 0-1
foreach($dist as $number => $chance) {
if (($totalProbability += $chance) <= $randomNumber) {
return $number;
}
}
return null; //only reachable on bad input
}
答案 1 :(得分:0)
如果集合很小,您可以构建一个数组,其中包含获得分发所需的每个值的正确数量,例如。 1 1 1 2 2 3将获得1的可能性提高3倍,就像得到3一样。然后,您将使用数组的长度来确定用作索引的随机数。