在Python、NumPy和R中生成相同的随机数序列
Python、NumPy和R这三种工具都使用同样的算法(梅森旋转算法)来生成随机数序列。从理论上讲,如果设置相同的种子,三者应该生成相同的随机数序列。但实际上并不是这样。我认为这三种实现使用了不同的参数,导致了这种情况。
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中各自调用的参数,以便得到相同的序列。
背景:这个问题源于一个EDX课程,课程中使用了R。在一个论坛上,有人问是否可以使用Python,工作人员回复说某些作业需要设置特定的种子并提交答案。
相关链接:
- 比较使用随机数生成的Matlab和Numpy代码:从中可以看出,NumPy和Matlab的底层实现是相似的。
- Python与Octave的随机数生成器:这个问题与想要的答案相当接近。需要对默认状态生成器进行某种封装。
2 个回答
10
使用 rpy2
可以在 Python 中调用 R 语言,这里有个示例,下面的 numpy 数组 data
和 R 中的 x
共享内存:
import rpy2.robjects as robjects
data = robjects.r("""
set.seed(1)
x <- runif(5)
""")
print np.array(data)
data[1] = 1.0
print robjects.r["x"]
11
我知道这个问题已经很老了,但我最近也遇到了同样的问题,所以我做了一个解决方案,希望对其他人有帮助。
我用C语言写了一个随机数生成器,并把它连接到了R和Python这两种语言上。这样一来,两个语言生成的随机数就能保证是一样的,因为它们都是用同一段C代码生成的。
这个程序叫做SyncRNG,可以在这里找到:https://github.com/GjjvdBurg/SyncRNG。