我如何创建一个在单独的方法中工作的 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
来实现,因为您可能需要具有其他参数(均值和方差)的其他正态分布。
我已经使用以下代码在我的 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
来实现,因为您可能需要具有其他参数(均值和方差)的其他正态分布。