我想用C 11标准库中的随机数分布包含简单的函数,它们将参数和发生器实例作为参数.例如:
double normal(double mean,double sd,std::mt19937_64& generator) { static std::normal_distribution<double> dist; return dist(generator,std::normal_distribution<double>::param_type(mean,sd)); }
我想避免分布对象中的任何隐藏状态,这样每个对这个包装函数的调用只取决于给定的参数. (可能的是,每次调用此函数可能需要一个不同的生成器实例).理想情况下,我将使分发实例为static const来确保这一点;然而,分发的operator()不是一个const函数,所以这是不可能的.
我的问题是:为了确保分发中没有隐藏的状态,是1)必要的和2)足以在每次分配上调用reset()?例如:
double normal(double mean,std::mt19937_64& generator) { static std::normal_distribution<double> dist; dist.reset(); return dist(generator,sd)); }
(总的来说,我对于随机分发的reset()函数的目的感到困惑…我明白为什么发生器有时需要重新设置/重新设置,但为什么配置对象需要重置?)
解决方法
To ensure there is no hidden state within the distribution,is it 1)
necessary
是.
and 2) sufficient to call reset() on the distribution each time?
是.
你可能不想这样做.至少不是每一个电话. std :: normal_distribution是允许发行版维护状态的海报小子.例如,一个流行的实现将使用Box-Muller transformation一次计算两个随机数,但是只返回其中一个,在下次调用时保存另一个.在下一次调用之前调用reset()将导致分配丢弃这个已经有效的结果,并将算法的效率降低一半.