【问题标题】:How to get random number with each number has its own probability [duplicate]如何获得每个数字都有自己的概率的随机数[重复]
【发布时间】:2013-03-06 02:14:39
【问题描述】:

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

【问题讨论】:

标签: c# math random probability probability-theory


【解决方案1】:

到目前为止,我最喜欢使用别名方法。

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
}

【讨论】:

  • 请注意,在阵列解决方案有效的情况下,此解决方案要慢得多。一个智能程序可能会根据分布调整其解决方案。
  • 或者只对 $dist 进行二分搜索。
  • 是的,如果您将二进制搜索与累积排序概率一起存储,它确实可以工作,但我认为这可能有点超出提问者的范围。
【解决方案2】:

如果集合很小,您可以构建一个数组,其中包含获取分布所需的每个值的正确数量,例如。 1 1 1 2 2 3 获得 1 的可能性是获得 3 的可能性的 3 倍。然后,您将使用数组的长度来确定用作索引的随机数。

【讨论】:

  • 请解释你的反对意见。
  • 我之前也是这么想的,可惜范围数很大。我认为的另一种方法是将百分比标准化为离散数字,例如 {0.2, 0.71, 0.29} -> {20, 71, 29}。并获得 0-100 的随机数。如果 rand>0.2 且 rand
  • 这是该问题的标准解决方案之一。请注意,我首先说“如果集合很小”
  • 如果集合很小,我仍然可以提供一个分配所有可用内存的输入。 0.00000001% => 1, 99.99999999% => 2.
  • 如果分发版可以编译成代码,这个方案也很快。如果集合是 arge,它确实需要大量内存。
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 2020-08-08
  • 2017-05-16
  • 1970-01-01
  • 2017-10-01
  • 2013-07-10
  • 2017-10-01
相关资源
最近更新 更多