这是我的代码。它假定生成normal_distribution
。
#include <iostream>
#include <random>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>
int main(int argc, const char *argv[])
{
// Initialize seed .
std::mt19937 gena;
boost::random::mt19937 genb;
gena.seed( 10 );
genb.seed( 10 );
std::normal_distribution<> norma;
boost::random::normal_distribution<> normb;
std::cout << "STD BOOST" << std::endl;
for (size_t i = 0; i < 20; i++)
std::cout << norma(gena) << ' ' << normb(genb) << std::endl;
return 0;
}
我在arch-linux上用gcc-8.1
进行了编译,得到了以下内容:
STD BOOST
-0.0512656 1.16196
-1.90693 -0.742973
1.23919 -1.10165
-0.212754 1.03149
-0.376303 0.597194
0.0660327 -0.12573
-1.01706 1.10728
0.907624 -0.370934
-0.682124 -0.404068
-0.461218 -0.46376
0.965666 -0.607265
0.560664 -1.44186
0.749932 0.449968
-0.31456 -0.268649
0.366249 0.986499
0.608089 -0.500526
-1.08684 -0.0215645
0.120559 -0.805144
1.40203 0.390409
-0.434259 0.0991071
我在Mac机(Apple LLVM version 7.0.2 (clang-700.1.81)
上使用了相同的代码);我得到以下信息:
STD BOOST
-1.90693 1.16196
-0.0512656 -0.742973
-0.212754 -1.10165
1.23919 1.03149
0.0660327 0.597194
-0.376303 -0.12573
0.907624 1.10728
-1.01706 -0.370934
-0.461218 -0.404068
-0.682124 -0.46376
0.560664 -0.607265
0.965666 -1.44186
-0.31456 0.449968
0.749932 -0.268649
0.608089 0.986499
0.366249 -0.500526
0.120559 -0.0215645
-1.08684 -0.805144
-0.434259 0.390409
1.40203 0.0991071
请注意,使用std::random
的第一列是不同的;但是如果仔细观察,第一列有许多共同的元素,但似乎被改组了。
我担心在我们更换旧的正态分布生成器以支持std::random
之后,在Travis上进行的一项测试失败之后(这意味着Ububtu-14.04和xcode-9.2将显示相同的结果)。
是错误吗?还是我做错了什么? BOOST正常。
答案 0 :(得分:3)
当您使用不同的编译器(甚至编译器的版本)时,正态分布中的伪随机数不必仅仅因为您使用了相同的种子而相同。除非我使用相同的编译器,编译器版本以及可能的优化设置,否则我不会依赖相同的顺序,如果需要的话,请查看编译器实现文档。
毫不奇怪,boost更加一致,因为尽管编译器有所不同,但您大概仍在使用相同的实现。