在 Python、NumPy 和 R 中创建相同的随机数序列
Posted
技术标签:
【中文标题】在 Python、NumPy 和 R 中创建相同的随机数序列【英文标题】:Creating same random number sequence in Python, NumPy and R 【发布时间】:2014-04-08 10:17:08 【问题描述】: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 在 [3] 中:random.seed(1) 在 [4] 中:[random.random() for x in range(5)] 输出[4]: [0.13436424411240122, 0.8474337369372327, 0.763774618976614, 0.2550690257394217, 0.49543508709194095]NumPy 在 [23] 中:将 numpy 导入为 np 在 [24] 中:np.random.seed(1) 在 [25] 中:np.random.rand(5) 出[25]: 数组([ 4.17022005e-01, 7.20324493e-01, 1.14374817e-04, 3.02332573e-01, 1.46755891e-01])
有什么方法可以让 NumPy 和 Python 实现产生相同的随机数序列?当然,正如一些 cmets 和答案所指出的,可以使用 rpy。我特别要寻找的是微调 Python 和 NumPy 中各自调用中的参数以获取序列。
上下文:问题来自使用 R 的 EDX 课程。在其中一个论坛上,有人问是否可以使用 Python,工作人员回答说有些作业需要设置特定的种子并提交答案。
相关:
-
Comparing Matlab and Numpy code that uses random number generation 由此看来,底层的 NumPy 和 Matlab 实现是相似的。
python vs octave random generator:这个问题确实非常接近预期的答案。需要对默认状态生成器进行某种包装。
【问题讨论】:
您可以使用 RPy(或类似的东西)直接从 R 获取随机数。 rpy.sourceforge.net @tom10 这是可能的。但是,我想应该有一种更清洁的方法! 刚刚快速浏览了 R 中的.Random.seed
和 numpy
中的 np.random.get_state()
之类的东西,看起来 numpy
使用无符号整数,而 R 使用有符号整数表示 RNG 的状态-我不确定你是否真的可以强迫他们表现得一样。
query the web,例如scan("http://www.random.org/integers/?num=10&min=1&max=6&col=1&base=10&format=plain&rnd=id.xyz")
@NipunBatra:我认为你低估了 R 中默认数字生成器的状态保持所涉及的程度(因为 R 确实有一个 RNG 集合,你可以在它们之间切换)。跨不同语言拥有相同流的唯一真正方法是重新实现一个通用生成器。 Paul Gilbert 在 15 年前就这样做了,在 R 和 S-Plus(R 的表亲和 S 的另一种不同的早期方言)中生成了相同的模拟。
【参考方案1】:
我意识到这是一个老问题,但我最近偶然发现了同样的问题,并创建了一个对其他人有用的解决方案。
我用 C 语言编写了一个随机数生成器,并将它与 R 和 Python 相关联。这样,随机数在两种语言中都可以保证是相同的,因为它们是使用相同的 C 代码生成的。
该程序名为 SyncRNG,可在此处找到:https://github.com/GjjvdBurg/SyncRNG。
【讨论】:
【参考方案2】:在python中使用rpy2
调用r,这里有一个demo,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"]
【讨论】:
谢谢。这看起来很容易。我仍然希望尽量避免使用 rpy2。原因是使用了相同的算法。以上是关于在 Python、NumPy 和 R 中创建相同的随机数序列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?