2

例如,我想从集合 S = {0, 1, 2, 3} 中获取随机数。但不是每个数字都有相同的概率显示(即 25%),现在我对每个数字都有不同的概率,比如说 {50%, 30%, 20%, 10%}。我该如何编码?在 Java 或 C# 中(我更喜欢 C#)。

4

2 回答 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 回答