簡體   English   中英

在Python,NumPy和R中創建相同的隨機數序列

[英]Creating same random number sequence in Python, NumPy and 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 :這個問題確實很接近預期的答案。 默認狀態生成器周圍需要某種包裝。

使用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"]

我意識到這是一個古老的問題,但是最近我偶然發現了同樣的問題,並創建了一個對其他人有用的解決方案。

我用C語言編寫了一個隨機數生成器,並將其鏈接到R和Python。 這樣,由於隨機數是使用相同的C代碼生成的,因此保證了兩種語言中的隨機數相同。

該程序稱為SyncRNG,可以在以下位置找到: https : //github.com/GjjvdBurg/SyncRNG

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM