我应该在我的C std随机分布上调用reset()来清除隐藏状态吗?

我想用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()将导致分配丢弃这个已经有效的结果,并将算法的效率降低一半.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...