为方便您说明此问题,我编写了以下简约代码。这些代码看起来很纯真,但结果令人惊讶!我在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
答案 0 :(得分:4)
问题出在您的构造函数中:
FillUpX(default_random_engine eng):generator{eng}{};
您按值获取引擎 ,然后保存对其的引用。该对象当然会在构造函数返回后被破坏,从而使引用无效。