This question already has answers here:
how to implement non uniform probability distribution?
                                
                                    (3个答案)
                                
                        
                                6年前关闭。
            
                    
例如,我想从集合S = {0,1,2,3}中获得随机数。但是,现在每个数字都有不同的概率,比如{50%,30%,20%,10%},而不是每个数字都有相同的概率显示(25%)。
我该如何编码?在Java或C#中(我更喜欢C#)。

最佳答案

到目前为止,别名方法是我最喜欢的方法。

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
}

09-05 22:14