如何创建一个在单独的方法中工作的c++随机正态分布

How do i create a c++ random normal distribution that works in a separate method?

本文关键字:方法 工作 c++ 正态分布 随机 单独 一个 何创建 创建      更新时间:2023-10-16

我已经使用以下代码在main()函数中获得了一个正常工作的正态分布:

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);
}

这将很高兴地打印出50个值,这些值遵循平均值6.0和平均值5.0的分布,例如:

#0= 0.999998
#1= 3.43872
#2= 6.83918
#3= -3.81324
#4= 16.0962
#5= 1.26236

然而,一旦我将相同的代码移动到一个方法中,并调用所述方法返回将填充输出的各个值,它只会再次返回相同的值:

double normalGenerator(double mean, double stdDev)
{
    default_random_engine generator(time(0));
    normal_distribution<double> distribution(mean,stdDev);
    return distribution(generator);
}

(在main()中):

for (int i = 0; i < 51; i++)
    {
        cout << "#" << i << "= " << distribution(generator);
        cout << " " << normalGenerator(6.0,5.0) << endl;
    }

输出:

#0= 5.49136 5.49136
#1= 7.6902 5.49136
#2= 14.4971 5.49136
#3= 11.946 5.49136
#4= 4.37424 5.49136
#5= 9.91711 5.49136

第一列是原始代码,第二列是名为value的方法。

我想我的问题是基于

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

行,但我对它们的工作原理的理解不太好,我也没有找到任何好的初学者级别的文档来帮助我理解它。

让我们来剖析一下您的normalGenerator方法:

double normalGenerator(double mean, double stdDev)
{
    default_random_engine generator(time(0)); // We initialize a generator
    normal_distribution<double> distribution(mean,stdDev); // And a distribution
    return distribution(generator); // distribution operator() always take the same generator with the same state
}

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

一个快速的改变,你就可以走了:

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所指出的,您还应该尽量保持使用相同的分发对象。通过这种方式,您可以从变量生成的潜在缓存中获益。

然而,这不能通过使对象static来实现,因为您可能需要具有其他参数(均值和方差)的其他正态分布。