Gaussian 在 C++ 中使用 bind 绘制给出的结果与显式地从分布中绘制不同
Gaussian draws in C++ using bind gives different result than drawing from distribution explicitly
我正在研究用C++生成高斯图的问题。正如标题所说,我似乎从使用 bind 而不是仅仅从分布中绘制得到了不同的结果。也就是说下面的代码
default_random_engine ran{1};
auto normal_draw = bind(normal_distribution<double>{0, 1}, ran);
for (int i = 0; i < 9; ++i)
cout << normal_draw() << endl;
cout << "new sequence" << endl;
for (int i = 0; i < 9; ++i)
cout << normal_distribution<double>{0, 1}(ran) << endl;
生成输出
-1.40287
-0.549746
-1.04515
1.58275
-1.95939
0.257594
-0.315292
-1.50781
0.071343
新序列
-1.40287
-1.04515
-1.95939
-0.315292
0.071343
-1.41555
0.631902
-0.903123
0.194431
我觉得这很困惑,因为我认为这两个序列是相同的。另请注意,如果使用 normal_draw() 生成 18 次抽奖,则包含最后 9 次抽奖的序列不等于上面的第二个序列。所以看起来直接从分布中提取使用的方法与 bind() 中隐含的方法不同,这显然不是这种情况。
有人可以解释一下我缺少什么吗?
提前致谢!
您在每次循环迭代时实例化一个临时分布对象。这将每次创建一个新状态。如果你不这样做,它们是相同的(假设随机生成器总是以相同的状态初始化):
#include <random>
#include <iostream>
#include <functional>
int main()
{
std::default_random_engine ran1{1};
auto normal_draw = std::bind(std::normal_distribution<double>{0, 1}, ran1);
for (int i = 0; i < 9; ++i)
std::cout << normal_draw() << ' ';
std::cout << '\n';
std::default_random_engine ran2{1};
std::normal_distribution<double> norman{0, 1};
for (int i = 0; i < 9; ++i)
std::cout << norman(ran2) << ' ';
}
我正在研究用C++生成高斯图的问题。正如标题所说,我似乎从使用 bind 而不是仅仅从分布中绘制得到了不同的结果。也就是说下面的代码
default_random_engine ran{1};
auto normal_draw = bind(normal_distribution<double>{0, 1}, ran);
for (int i = 0; i < 9; ++i)
cout << normal_draw() << endl;
cout << "new sequence" << endl;
for (int i = 0; i < 9; ++i)
cout << normal_distribution<double>{0, 1}(ran) << endl;
生成输出
-1.40287 -0.549746 -1.04515 1.58275 -1.95939 0.257594 -0.315292 -1.50781 0.071343
新序列
-1.40287 -1.04515 -1.95939 -0.315292 0.071343 -1.41555 0.631902 -0.903123 0.194431
我觉得这很困惑,因为我认为这两个序列是相同的。另请注意,如果使用 normal_draw() 生成 18 次抽奖,则包含最后 9 次抽奖的序列不等于上面的第二个序列。所以看起来直接从分布中提取使用的方法与 bind() 中隐含的方法不同,这显然不是这种情况。
有人可以解释一下我缺少什么吗?
提前致谢!
您在每次循环迭代时实例化一个临时分布对象。这将每次创建一个新状态。如果你不这样做,它们是相同的(假设随机生成器总是以相同的状态初始化):
#include <random>
#include <iostream>
#include <functional>
int main()
{
std::default_random_engine ran1{1};
auto normal_draw = std::bind(std::normal_distribution<double>{0, 1}, ran1);
for (int i = 0; i < 9; ++i)
std::cout << normal_draw() << ' ';
std::cout << '\n';
std::default_random_engine ran2{1};
std::normal_distribution<double> norman{0, 1};
for (int i = 0; i < 9; ++i)
std::cout << norman(ran2) << ' ';
}