我需要从二项式分布中快速生成大量随机数,以获得截然不同的试验大小(但大多数都会很小)。我希望不必手动编写算法(例如,参见this related discussion from November),因为我是一名新手程序员并且不喜欢重新发明轮子。 Boost似乎没有为二项分布变量提供生成器,但是TR1和GSL可以。是否有充分的理由选择其中一个,或者我更好地根据自己的情况编写一些东西?我不知道这是否有意义,但我将在整个程序中从均匀分布和二项分布生成数字之间交替,我希望它们共享相同的种子并最小化开销。对于我应该考虑的内容,我会喜欢一些建议或例子。
答案 0 :(得分:6)
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
答案 1 :(得分:2)
你误解了Boost模型 - 你选择一个随机数生成器类型,然后选择一个分布来扩展RNG产生的值。在this answer中有一个非常简单的例子,它使用均匀分布,但其他分布使用相同的基本模式 - 生成器和分布完全解耦。