我正在尝试使用C ++ 11中的标题编写一个小程序i C ++。我使用内置的发行版来生成统一的整数和双重分布。我写了一个非常小的测试:
#include <random>
#include <iostream>
int main()
{
std::mt19937 rng(1234567890);
std::uniform_int_distribution<long int> uniformInt(1,10000);
std::uniform_real_distribution<double> uniformDouble(0.0, 1.0);
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(16);
std::cout << rng() << std::endl;
std::cout << uniformInt(rng) << std::endl;
std::cout << uniformDouble(rng) << std::endl;
}
我使用常数种子播种Marsenne Twister PRNG,并生成两个分布,一个用于给出1到10000之间的随机数,一个用于间隔0.0,1.0,分别用于long int和double。我通过直接从Marsenne Twister打印一个随机数来结束样本,一个整数和一个双。
当我编译并运行它时,我的问题就来了。使用Clang(clang-900.0.39.2)我得到以下输出:
2657703298
6144
0.1490309349241722
如果我用g ++ - 7(Homebrew GCC 7.3.0)编译它,我得到:
2657703298
3406
0.1490309349241722
第一个和最后一个输出是相同的,而间隔(1,10000)上的整数不相同。
我很高兴看到MT产生确定性随机数,但同时我有点担心均匀分布上的整数在这两个编译器之间明显不一样。是否有一个小细节,我错过了这些发行版应该如何工作,或者这是预期的?
我认为在C ++中包含这些内容很棒,但我觉得这很令人担忧,因为我希望我的数据可以在系统/编译器之间重现。