在 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.seednumpy 中的 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 中创建相同的随机数序列的主要内容,如果未能解决你的问题,请参考以下文章

如何在python numpy中创建随机正交矩阵

如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?

Numpy,在 C++ 段错误中创建一维数组

R语言如何创建n行相同矩阵

ValueError:在Python中创建KMeans模型时x和y的大小必须相同

通过网状在R中创建python列表