加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:06:13 所属栏目:百科 来源:网络整理
导读:我想用C 11标准库中的随机数分布包含简单的函数,它们将参数和发生器实例作为参数.例如: double normal(double mean,double sd,std::mt19937_64 generator){ static std::normal_distributiondouble dist; return dist(generator,std::normal_distributiondo
我想用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()将导致分配丢弃这个已经有效的结果,并将算法的效率降低一半.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读