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

前端之家收集整理的这篇文章主要介绍了我应该在我的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&C++相关文章