如何创建C++随机正态分布,以单独的方法工作?

如何创建C++随机正态分布,以单独的方法工作?,c++,random,generator,normal-distribution,C++,Random,Generator,Normal Distribution,我已经使用以下代码在我的主函数中获得了正常工作分布: default_random_engine generator(time(0)); normal_distribution<double> distribution(6.0,5.0); for (int i = 0; i < 51; i++) { cout << "#" << i << "= " << distribution(generator); } 但是,当

我已经使用以下代码在我的主函数中获得了正常工作分布:

default_random_engine generator(time(0));
normal_distribution<double> distribution(6.0,5.0);


for (int i = 0; i < 51; i++)
{
    cout << "#" << i << "= " << distribution(generator);
}
但是,当我将相同的代码移动到方法中并调用所述方法以返回将填充输出的单个值时,它只会再次返回相同的值:

double normalGenerator(double mean, double stdDev)
{
    default_random_engine generator(time(0));
    normal_distribution<double> distribution(mean,stdDev);
    return distribution(generator);
}
第一列是原始代码,第二列是名为value的方法

我想我的问题是基于

default_random_engine generator(time(0));
normal_distribution<double> distribution(6.0,5.0);
方法中有行,但我对它们如何工作的理解不是很好,我还没有找到任何好的入门文档来帮助我理解它。

让我们来分析一下normalGenerator方法:

伪随机生成器是确定性的,因此,如果您继续向分布对象提供处于相同状态的生成器,它将继续一次又一次地输出相同的值。但是,每次使用生成器时,其内部状态都会发生变化,因此,在生成其他值时,您将获得其他输出

快换一下,你就可以出发了:

default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);
变成:

static default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);
正如@PeterBecker指出的,您还应该尝试继续使用相同的分发对象。通过这种方式,您可以从变量生成的潜在缓存中获益

但是,这无法通过使对象保持静态来实现,因为您可能需要具有其他参数均值和方差的其他正态分布。

让我们分析一下您的法线生成器方法:

伪随机生成器是确定性的,因此,如果您继续向分布对象提供处于相同状态的生成器,它将继续一次又一次地输出相同的值。但是,每次使用生成器时,其内部状态都会发生变化,因此,在生成其他值时,您将获得其他输出

快换一下,你就可以出发了:

default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);
变成:

static default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);
正如@PeterBecker指出的,您还应该尝试继续使用相同的分发对象。通过这种方式,您可以从变量生成的潜在缓存中获益


但是,这无法通过使对象保持静态来实现,因为您可能需要具有其他参数均值和方差的其他正态分布。

在循环中播种-一个非常常见的错误。在循环中播种-一个非常常见的错误。OP不使用0初始化生成器,而是使用时间0进行初始化,时间0随发射而变化,但这也不是很好的解决方案。我认为他应该使用std::random_设备进行初始化。分发也应该是静态的。它可以像编写的那样正常工作,但是发行版有时一次生成多个值,并保存额外的值以供以后使用。每次创建一个新的发行版都会绕过此缓存,并会产生性能影响。我编辑了我的答案,以反映@PeteBeckerOP的注释并没有用0初始化生成器,而是用time0来初始化生成器,时间会因启动而异,但这也不是很好的解决方案。我认为他应该使用std::random_设备进行初始化。分发也应该是静态的。它可以像编写的那样正常工作,但是发行版有时一次生成多个值,并保存额外的值以供以后使用。每次创建一个新的发行版都会绕过这个缓存,并产生性能上的影响。我编辑了我的答案,以反映这个评论@PeteBecker
default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);
static default_random_engine generator(time(0));
normal_distribution<double> distribution(mean,stdDev);