Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何得到随机数,每个数都有自己的概率_C#_Math_Random_Probability_Probability Theory - Fatal编程技术网

C# 如何得到随机数,每个数都有自己的概率

C# 如何得到随机数,每个数都有自己的概率,c#,math,random,probability,probability-theory,C#,Math,Random,Probability,Probability Theory,例如,我想从集合S={0,1,2,3}中获取随机数。但不是每个数字都有相同的概率(25%),而是每个数字有不同的概率,比如说{50%,30%,20%,10%}。 如何编写此代码?在Java或C#中(我更喜欢C#)。Alias方法是目前为止我最喜欢的方法 我还没有看过这段代码,但它是谷歌的一个顶级结果 这是另一个更好的解释 事实上,我经常在面试中使用这个问题,因为如果你以前从未见过这个问题,它可能会让人相当困惑 如果以上内容太多,您无法实现,那么在输入解决方案中有一个更简单的单循环 使用PHP

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

Alias方法是目前为止我最喜欢的方法

我还没有看过这段代码,但它是谷歌的一个顶级结果

这是另一个更好的解释

事实上,我经常在面试中使用这个问题,因为如果你以前从未见过这个问题,它可能会让人相当困惑

如果以上内容太多,您无法实现,那么在输入解决方案中有一个更简单的单循环

使用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
}
函数getNumberFromDistribution($dist){ $totalProbability=0; $randomNumber=mt_rand(0,mt_getrandmax())/mt_getrandmax();//0-1之间的统一随机数 foreach($dist as$number=>$chance){
如果($totalProbability+=$chance)如果集合很小,您可以构建一个数组,其中包含获得分布所需的每个值的正确数字。例如,1 2 3将提供获得1的可能性是获得3的可能性的3倍。然后,您可以使用数组的长度来确定用作索引的随机数。

除此之外,还有许多其他方法:@MitchWheat:是的,我想是的。因为我不知道它在概率论中叫什么,所以我在这里问了这个问题。它叫非均匀probability@MitchWheat:谢谢你提供的信息:请解释你的否决票。我以前也这么想过,但不幸的是,范围数字很大。我认为的另一种方法是将perc标准化对离散数如{0.2,0.71,0.29}->{20,71,29}进行entage运算,得到0-100之间的随机数。如果rand>0.2和rand,这是这个问题的标准解决方案之一。注意,我一开始说“如果集合很小”如果集合很小,我仍然可以提供一个将分配所有可用内存的输入。0.00000001%=>1,99.9999999%=>2。如果可以将分布编译到代码中,则此解决方案也非常快。如果集合很大,则确实需要大量内存。请注意,在阵列解决方案可以工作的情况下,此解决方案会慢得多。smart程序可能会根据分布情况调整其解决方案。或者只在$dist上执行二进制搜索。是的,如果使用累积排序概率存储,则二进制搜索确实有效,但我认为这可能有点超出询问者的范围。