为了方便说明这个问题,我做了如下极简代码。这些代码看起来很无辜,但结果却令人惊讶!我在我的 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
最佳答案
问题出在你的构造函数中:
FillUpX(default_random_engine eng):generator{eng}{};
您按值获取引擎,然后保存对它的引用。一旦构造函数返回,该对象当然会被破坏,使您的引用无效。
关于c++ - 通过函数传递随机引擎 - 为什么不同的编译器表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447362/