在Python,NumPy和R中创建相同的随机数序列

Nip*_*tra 17 python arrays random numpy r

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,并且工作人员回答说某些任务需要设置特定种子并提交答案.

有关:

  1. 比较使用随机数生成的Matlab和Numpy代码从这看起来,底层的NumPy和Matlab实现是相似的.
  2. python vs octave random generator:这个问题确实非常接近预期的答案.需要在默认状态生成器周围使用某种包装器.

HYR*_*YRY 7

用来rpy2在python中调用r,这是一个demo,numpy数组在R中data共享内存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"]
Run Code Online (Sandbox Code Playgroud)


Gjj*_*urg 6

我意识到这是一个老问题,但我最近偶然发现了同样的问题,并创建了一个对其他人有用的解决方案.

我在C中编写了一个随机数生成器,并将它链接到R和Python.这样,两种语言中的随机数保证相同,因为它们是使用相同的C代码生成的.

该程序名为SyncRNG,可在此处找到:https://github.com/GjjvdBurg/SyncRNG.