gpt4 book ai didi

c++ - 为什么 boost 的随机数生成(正态分布)总是给出相同的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:42 35 4
gpt4 key购买 nike

我正在生成一些随机数并出现可疑行为。这是我的代码:

    // initialized earlier... in the constructor of a class
boost::mt19937 *rng = new boost::mt19937();
rng->seed(time(NULL));

// actual use here.
for (int i = 0; i < 10; ++i)
{
test();
}


void test()
{
boost::normal_distribution<> distribution(10, 10);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);

const double sample = (resampler)(); // always the same value.
}

我是否滥用了 boost 中的随机采样?我做错了什么使它始终具有相同的值(value)。我在构造函数中初始化了随机数生成器,因此它应该始终吐出不同的值(不会重新初始化)

最佳答案

问题出在 boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution); 行.此构造函数按值获取其参数(请参阅 the documentation )。所以每个 resampler从生成器的相同拷贝开始并调用它一次。


编辑:Shafik 在我之后注意到了同样的事情。如果你真的不能将初始化 boost 到循环之外,你也可以重新设置生成器的种子。根据您的应用程序,有多种方法可以完成此操作。下面只是一个例子:

void test()
{
static unsigned int seed = 0
rng->seed((++seed) + time(NULL));

boost::normal_distribution<> distribution(10, 10);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);

const double sample = (resampler)(); // always the same value.
}

注意:不要重新播种rng只有 time(NULL) ,因为如果您调用 test() 可能会多次返回相同的值在一个紧密的循环中。

关于c++ - 为什么 boost 的随机数生成(正态分布)总是给出相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747194/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com