在Python、NumPy和R中生成相同的随机数序列

20 投票
2 回答
11561 浏览
提问于 2025-04-17 21:01

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,工作人员回复说某些作业需要设置特定的种子并提交答案。

相关链接:

  1. 比较使用随机数生成的Matlab和Numpy代码:从中可以看出,NumPy和Matlab的底层实现是相似的。
  2. 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

撰写回答