如何获得每个数字的随机数有其自己的概率

时间:2013-03-06 02:14:40

标签: c# math random probability probability-theory

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

2 个答案:

答案 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一样。然后,您将使用数组的长度来确定用作索引的随机数。