例如,我想从集合 S = {0, 1, 2, 3} 中获取随机数。但不是每个数字都有相同的概率显示(即 25%),现在我对每个数字都有不同的概率,比如说 {50%, 30%, 20%, 10%}。我该如何编码?在 Java 或 C# 中(我更喜欢 C#)。
问问题
1299 次
2 回答
3
到目前为止,别名方法是我最喜欢的方法。
http://code.activestate.com/recipes/576564-walkers-alias-method-for-random-objects-with-diffe/
我还没有查看此代码,但它是谷歌的顶级结果。
这是另一个更好的解释
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
}
于 2013-03-06T02:16:30.033 回答
0
如果集合很小,您可以构建一个数组,其中包含获得分布所需的每个值的正确数量,例如。1 1 1 2 2 3 获得 1 的可能性是获得 3 的可能性的 3 倍。然后,您将使用数组的长度来确定用作索引的随机数。
于 2013-03-06T02:19:53.563 回答