我应该在我的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()函数的目的感到困惑…我明白为什么发生器有时需要重新设置/重新设置,但为什么配置对象需要重置?) 解决方法
是.
是. 你可能不想这样做.至少不是每一个电话. std :: normal_distribution是允许发行版维护状态的海报小子.例如,一个流行的实现将使用Box-Muller transformation一次计算两个随机数,但是只返回其中一个,在下次调用时保存另一个.在下一次调用之前调用reset()将导致分配丢弃这个已经有效的结果,并将算法的效率降低一半. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |