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