【问题标题】:Non-Uniform Random Number Generator Implementation?非均匀随机数生成器实现?
【发布时间】:2010-12-04 19:01:01
【问题描述】:

我需要一个随机数生成器,它可以选择具有可编程平均值的指定范围内的数字。

例如,我需要选择 2 到 14 之间的数字,并且我需要随机数的平均值为 5。

我经常使用随机数生成器。通常我只需要均匀分布。

我什至不知道如何称呼这种分布。

感谢您提供的任何帮助或见解。

【问题讨论】:

  • 您确定您提供了足够的有关分发的信息吗?我相信平均价值是不够的。考虑这个例子:假设我们从{0, 1, 2} 生成随机数,均值为 1。现在看看这两个生成器:Generator1 (0: 40%, 1: 20%, 2: 40%)Generator2 (0:10%, 1: 80%, 2:10%)。他们两个的平均结果都是 1。
  • 几乎重复:stackoverflow.com/questions/977354/…。非平面伪随机分布是一个标准主题,在 SO 上已不止一次讨论过。提供更多信息,我们可以为您指明正确的方向。
  • 如果目标分布不容易用可集成的 PDF 表示,请查看:stackoverflow.com/questions/423006/…
  • WRT 就像 GrzegorzOledzki 所说的那样,您可以使用均匀分布满足所述要求,除了使 2 的发生频率比其他值高 14 倍 - 即从具有 2 的 14 次重复的列表中均匀选择。容易,但可能不太合适。

标签: statistics random numbers


【解决方案1】:

如果您对该分布的形状感到满意,您也许可以使用binomial distribution。设置 n=12 和 p=0.25。这将为您提供一个介于 0 和 12 之间的值,平均值为 3。只需在每个结果中添加 2 即可获得您正在寻找的范围和平均值。

编辑:至于实现,您可能可以为您选择的语言找到一个支持非均匀分布的库(我有written one myself for Java)。

使用均匀 RNG 可以很容易地近似二项分布。只需执行 n 次试验并记录成功次数。所以如果你有 n=10 和 p=0.5,这就像连续掷硬币 10 次并计算正面的数量。对于 p=0.25,只需生成 0 到 3 之间的均匀分布值,并且仅将零计为成功。

如果您想要更高效的实现,在 Knuth 的计算机编程艺术第 2 卷的练习中隐藏了一个巧妙的算法。

【讨论】:

【解决方案2】:

你还没有说你想要什么样的发行版。关于您的具体示例,一个产生 2 到 8 之间均匀分布的函数将满足您的要求,严格按照您编写的那样:)

【讨论】:

  • 我认为 OP 打算让 9-14 的值有一定的被选中的可能性。
【解决方案3】:

如果您想要随机数的非均匀分布,那么您可能需要实现某种映射,例如:

// returns a number between 0..5 with a custom distribution
int MyCustomDistribution()
{
  int r = rand(100); // random number between 0..100
  if (r < 10) return 1;
  if (r < 30) return 2;
  if (r < 42) return 3;
  ...
}

【讨论】:

    【解决方案4】:

    基于关于非均匀生成器的Wikipedia sub-article,您似乎希望将均匀伪随机数生成器的输出应用于满足所需均值的区域分布。

    【讨论】:

      【解决方案5】:

      您可以从一个统一的 PRNG 创建一个非统一的 PRNG。这是有道理的,因为您可以想象采用返回 0,1,2 的统一 PRNG,并通过为值 0,1 返回 0 和为值 2 返回 1 来创建一个新的非统一 PRNG。

      如果您想了解新的非统一 PRNG 分布的特定特征,还有更多内容。 the Wikipedia page on PRNGs 对此进行了介绍,并特别提到了 Ziggurat algorithm

      有了这些线索,你应该能够搜索到一些代码。

      【讨论】:

        【解决方案6】:

        我的第一个想法是:

        • 生成 0..1 范围内的数字
        • 缩放到 -9..9 ( x-0.5; x*18) 范围
        • 将范围移动 5 -> -4 .. 14(加 5)
        • 将范围截断为 2..14(丢弃数字

        这应该给你你想要的范围内的数字。

        【讨论】:

        • 但是当你丢弃
        【解决方案7】:

        您需要一个分布式/加权随机数生成器。 Here's a reference 让您开始。

        【讨论】:

          【解决方案8】:
          Assign all numbers equal probabilities,
          

          虽然 currentAverage 不等于预期平均(在可能的范围内)

           pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again)
          
           if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage)
          
             increase pickedNumber's probability by delta at the expense of all others, conserving sum=100%
          
           else
          
             decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100%
          
           end if
          
           delta=0.98*delta (the rate of decrease of delta should probably be experimented with)
          

          结束

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-07
            • 1970-01-01
            • 2013-07-22
            • 2017-07-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多