我需要从二项式分布中快速生成大量随机数,以用于显着不同的试验规模(然而,大多数会很小)。我希望不必手动编写算法(例如,参见11 月的相关讨论),因为我是新手程序员,不喜欢重新发明轮子。看来 Boost 不提供二项分布变量的生成器,但TR1和GSL做。是否有充分的理由选择一个而不是另一个,或者我根据自己的情况编写一些定制的东西更好?我不知道这是否有意义,但我将在整个程序中从均匀分布和二项分布生成数字之间交替,我希望它们共享相同的种子并最大限度地减少开销。对于我应该考虑的问题,我很乐意提供一些建议或示例。
问问题
4075 次
2 回答
6
Boost 1.43 似乎支持二项分布。您可以使用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
于 2010-05-07T20:51:12.723 回答
2
您误解了 Boost 模型 - 您选择了一个随机数生成器类型,然后选择了一个分布,在该分布上传播 RNG 产生的值。这个答案中有一个非常简单的例子,它使用均匀分布,但其他分布使用相同的基本模式——生成器和分布完全解耦。
于 2010-05-07T21:21:02.457 回答