我可以反复创建&销毁随机发生器/分配器对象并将其销毁(使用'骰子'类)?

时间:2013-08-10 17:59:02

标签: object c++11 random dice

我正在尝试从new library in C++11生成随机数生成一个简单的骰子类。我并没有真正理解实际发生的事情,但参考文献显示了一个简单的例子:

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

我在某个地方阅读过“老”的方法,你应该只在你的应用程序中播种一次(例如在 main 函数中)。但是,我想要一个容易重复使用的骰子课程。那么在dice::roll()方法中使用此代码块是否可以,尽管在应用程序中多次实例化和销毁多个骰子对象?

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

1 个答案:

答案 0 :(得分:1)

考虑将伪随机数生成器(PRNG)实例化为挖井 - 这是您必须经历的能够获得水的开销。生成伪随机数的实例就像浸入井中一样。大多数人每次想要喝水都不会挖新井,为什么要调用多个实例化的不必要开销来获得额外的伪随机数呢?

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

除非您确实知道自己在做什么,并且正在尝试对variance reduction使用相关归纳策略,否则最佳做法是使用PRNG的单个实例化并继续返回以获取其他值。