【发布时间】:2019-11-30 21:59:35
【问题描述】:
我正在尝试将 C++ 代码复制到 Python 3.6 中,但每个实现中的伪随机数序列都不同。两种实现的种子都是相同的,据我所知,两者都使用 Mersenne Twister 算法。
我做错了什么?
记住1:两个代码使用相同的种子
记住 2:据我所知,这两个代码都使用了实现相同算法 (Mersenne Twister) 的函数。
C++:
#include <random>
#include <iostream>
int main(int argc, char* argv[])
{
std::mt19937 gen(2);
std::uniform_int_distribution<> dis(0, 61);
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
return 0;
}
Python 3.6:
import numpy as np
rng = np.random.RandomState(2)
for i in range(10):
print(str(rng.randint(0, 62)))
注意:randint 有一个独占的上限。这就是为什么我在 C++ 代码上使用 61,而在 Python 代码上使用 62。
【问题讨论】:
-
但是伪随机数的序列在每个实现中是不同的 -- 这不是一个特性而不是一个错误吗?
-
据我所知,两种实现都使用相同的算法(Mersenne Twister)。这样,一旦种子相同,结果应该是相同的。
-
@thc 真的吗????这是我只在 Python 上得到的序列。我不明白,但我会三重检查:-)
-
是的,我用过:
g++ temp.cpp -o temp然后./temp输出40 15 45 8 22 43 18 11 40 7。编译器在 OS X 上很响。 -
我的是 g++ (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0,我真的不知道为什么它会给出不同的结果,但再次感谢你。
标签: python c++ random mersenne-twister