Python、NumPy 和 R 都使用相同的算法(Mersenne Twister)来生成随机数序列。因此,从理论上讲,设置相同的种子应该会在所有 3 个中产生相同的随机数序列。但事实并非如此。我认为这 3 个实现使用不同的参数导致了这种行为。
R
>set.seed(1)
>runif(5)
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
Python
In [3]: random.seed(1)
In [4]: [random.random() for x in range(5)]
Out[4]:
[0.13436424411240122,
0.8474337369372327,
0.763774618976614,
0.2550690257394217,
0.49543508709194095]
NumPy
In [23]: import numpy as np
In [24]: np.random.seed(1)
In [25]: np.random.rand(5)
Out[25]:
array([ 4.17022005e-01, 7.20324493e-01, 1.14374817e-04,
3.02332573e-01, 1.46755891e-01])
有什么方法可以让 NumPy 和 Python 实现产生相同的随机数序列吗?当然,正如一些评论和答案指出的那样,可以使用 rpy。我特别寻找的是微调 Python 和 NumPy 中各自调用中的参数以获得序列。
背景:这种担忧来自使用 R 的 EDX 课程。在其中一个论坛中,有人询问是否可以使用Python,工作人员回答说,有些作业需要设置特定的种子并提交答案。
有关的:
-
比较使用随机数生成的 Matlab 和 Numpy 代码 https://stackoverflow.com/questions/18486241/comparing-matlab-and-numpy-code-that-uses-random-number-generation?rq=1由此看来,NumPy 和 Matlab 的底层实现是相似的。
-
python 与八度随机发生器 https://stackoverflow.com/questions/13735096/python-vs-octave-random-generator?rq=1: 这个问题确实非常接近预期的答案。需要对默认状态生成器进行某种包装。