1

我正在为一个简单的骰子类尝试从C++11 中的新库生成随机数。我并没有真正掌握实际发生的情况,但参考资料显示了一个简单的例子:

std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1,6);
int dice_roll = distribution(generator);

我在某处读到,使用“旧”方式,理想情况下,您应该只在应用程序中播种一次(例如在主函数中)。但是我想要一个易于重复使用的骰子类。那么,dice::roll()尽管在应用程序中多次实例化和销毁多个 dice 对象,但在方法中使用此代码块是否可以?

目前我将生成器作为类成员,最后两行在 dice:roll() 方法中。看起来不错,但在我计算统计数据之前,我想我会在这里问...

4

1 回答 1

1

将伪随机数生成器 (PRNG) 实例化为挖井 - 这是您必须通过才能获得水的开销。生成伪随机数的实例就像浸入井中一样。大多数人不会在每次想喝水的时候挖一口新井,为什么要调用多次实例化的不必要开销来获得额外的伪随机数?

除了不必要的开销之外,还有一个统计风险。PRNG 的底层实现是确定性函数,它们更新一些内部维护的状态以生成下一个值。这些函数经过精心设计,可以提供一系列不相关(但不是独立!)的值。但是,如果两个或多个 PRNG 的状态通过种子初始化相同,它们将产生完全相同的序列。如果播种基于时钟(常见的默认设置),在时钟的同一滴答声内初始化的 PRNG 将产生相同的结果。如果您的统计结果具有独立性作为要求,那么您就完蛋了。

除非您真的知道自己在做什么并且正在尝试使用相关归纳策略来减少方差,否则最佳实践是使用 PRNG 的单个实例化并继续返回它以获得其他值。

于 2013-08-10T18:27:21.510 回答