【发布时间】:2011-04-29 07:58:22
【问题描述】:
为了检查我的 C++ 代码,我希望能够让 Boost::Random 和 Matlab 产生相同的随机数。
所以对于 Boost,我使用代码:
boost::mt19937 var(static_cast<unsigned> (std::time(0)));
boost::uniform_int<> dist(1, 6);
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(var, dist);
die.engine().seed(0);
for(int i = 0; i < 10; ++i) {
std::cout << die() << " ";
}
std::cout << std::endl;
产生(程序的每次运行):4 4 5 6 4 6 4 6 3 4
对于我使用的 matlab:
RandStream.setDefaultStream(RandStream('mt19937ar','seed',0));
randi(6,1,10)
产生(程序的每次运行):5 6 1 6 4 1 2 4 6 6
这很奇怪,因为两者都使用相同的算法和相同的种子。 我错过了什么?
似乎 Python(使用 numpy)和 Matlab 似乎具有可比性,在随机统一数方面: MATLAB
RandStream.setDefaultStream(RandStream('mt19937ar','seed',203));rand(1,10)
0.8479 0.1889 0.4506 0.6253 0.9697 0.2078 0.5944 0.9115 0.2457 0.7743
Python: random.seed(203);random.random(10)
array([ 0.84790006, 0.18893843, 0.45060688, 0.62534723, 0.96974765,
0.20780668, 0.59444858, 0.91145688, 0.24568615, 0.77430378])
C++Boost
0.8479 0.667228 0.188938 0.715892 0.450607 0.0790326 0.625347 0.972369 0.969748 0.858771
这与其他 Python 和 Matlab 值相同...
【问题讨论】:
-
您为什么不在 C 或 MATLAB 中生成随机流,将其存储在文件中,然后通过两种环境访问它?
-
我认为你不应该喂 Boost whit time(0)。
-
@ntt,这是一种可能性,但对我来说并不有利,这似乎真的是一个 hack。
-
@ralu,好的,感谢您的提示,但即使没有该初始化结果也完全相同
-
至少要弄清楚是否多次运行相同的 init 每次都会为每个函数产生相同的结果。据我所知,MT 使用自己的种子生成器。