通过函数传递随机引擎-为什么不同的编译器表现不同

时间:2018-07-20 17:06:40

标签: c++ c++11

为方便您说明此问题,我编写了以下简约代码。这些代码看起来很纯真,但结果令人惊讶!我在Mac和PC上尝试了不同的编译器。 gcc看起来不错,但是clang提供了错误的结果。我的猜测是,这可能是一些未定义的行为。 Mac结果显示非随机数的重复模式。为什么会这样?

这是密码

#include <iostream>
#include<random>
using namespace std;

class FillUpX{
public:
    FillUpX(default_random_engine eng):generator{eng}{};
    void printValue(){
        for(int i=0;i<10;++i){
            cout << rnorm(generator) << endl;
        }
    }

private:
    default_random_engine & generator;
    std::normal_distribution<> rnorm{0,1};
};


int main(){

    unsigned seed=10;
    std::default_random_engine gen{seed};


    FillUpX fhd(gen);
    fhd.printValue();

   return 0;
}

这是输出

-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039

1 个答案:

答案 0 :(得分:4)

问题出在您的构造函数中:

FillUpX(default_random_engine eng):generator{eng}{};

您按值获取引擎 ,然后保存对其的引用。该对象当然会在构造函数返回后被破坏,从而使引用无效。