如何创建一个在单独的方法中工作的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
然而,一旦我将相同的代码移动到一个方法中,并调用所述方法返回将填充输出的各个值,它只会再次返回相同的值:
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
来实现,因为您可能需要具有其他参数(均值和方差)的其他正态分布。
相关文章:
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- std::bind,无法让具有单个参数的方法工作
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 让类与运算符一起工作更简单的方法
- 找不到使保证返回值优化工作的方法
- C++ set_difference方法未按预期工作
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- C 方法无法工作
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 这种奇怪的 I/O 方法是如何工作的?
- 在 Xcode 中工作的 CMake 中启用地址清理器的正确方法是什么
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 我试着了解方法覆盖是如何工作的,不知道为什么输出 2
- 我的重载后增量方法无法按预期工作。为什么?
- 无法使方法存在检测机制正常工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?