【问题标题】:Random numbers from binomial distribution二项分布的随机数
【发布时间】:2010-05-07 20:27:14
【问题描述】:

我需要从二项式分布中快速生成大量随机数,以用于显着不同的试验规模(但大多数会很小)。我希望不必手动编写算法(例如,参见this related discussion from November),因为我是新手程序员,不喜欢重新发明轮子。似乎 Boost 不提供二项分布变量的生成器,但 TR1 和 GSL 提供。是否有充分的理由选择一个而不是另一个,或者我根据自己的情况编写一些定制的东西更好?我不知道这是否有意义,但我将在整个程序中从均匀分布和二项分布生成数字之间交替,我希望它们共享相同的种子并最大限度地减少开销。对于我应该考虑的问题,我很乐意提供一些建议或示例。

【问题讨论】:

  • 请参阅Biassed Random Number Generator 了解关于非均匀 PRNG 的一些讨论。不过,它并没有直接回答您的问题,而且您的“十一月”参考资料看起来也很相关。
  • “Biassed...”链接再次引用了 Boost 库,它们似乎没有用于二项分布的 PRNG。十一月的参考给出了一些近似值。据我了解,从试验次数可能有很大差异的二项分布中提出高效和高质量的 PRNG 是一个数学挑战。我希望已经存在一个可以处理所有这些场景的库。看起来我可能必须自己测试 TR1 和 GSL——希望这里的其他人可能已经有经验。

标签: c++ random tr1 gsl


【解决方案1】:

Boost 1.43 似乎支持binomial distributions。您可以使用boost::variate_generator 将您的随机源连接到类型 您要从中采样的分布。

所以您的代码可能看起来像这样(免责声明:未经测试!):

boost::mt19937 rng;                 // produces randomness out of thin air
                                    // see pseudo-random number generators
const int n = 20;
const double p = 0.5;
boost::binomial<> my_binomial(n,p);      // binomial distribution with n=20, p=0.5
                                         // see random number distributions
boost::variate_generator<boost::mt19937&, boost::binomial<> >
         next_value(rng, my_binomial);     // glues randomness with mapping
int x = next_value();                      // simulate flipping a fair coin 20 times

【讨论】:

  • 如果我理解正确,它实际上并不支持来自这些发行版的 PRNG。它计算概率和累积质量函数等。
  • 呸,现在我明白了。谢谢——你的例子很有帮助。
【解决方案2】:

您误解了 Boost 模型 - 您选择了一种随机数生成器类型,然后选择了一个分布,在该分布上传播 RNG 产生的值。 this answer 中有一个非常简单的例子,它使用均匀分布,但其他分布使用相同的基本模式——生成器和分布完全解耦。

【讨论】:

  • 嘿,我的 Boost 速度还不够快。感谢您解释它在做什么。
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2013-04-02
  • 2010-09-16
  • 2019-08-02
相关资源
最近更新 更多