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

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

我已经使用以下代码在我的 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

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

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

第一列是原始代码,第二列是方法调用值。

我假设我的问题是基于

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 来实现,因为您可能需要具有其他参数(均值和方差)的其他正态分布。