Создание такой же последовательности случайных чисел в Python, NumPy и R

Python, NumPy и R используют один и тот же алгоритм (Mersenne Twister) для генерации случайных числовых последовательностей. Таким образом, теоретически говоря, установка одного и того же семени должна приводить к одинаковым последовательностям случайных чисел во всех 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, чтобы получить последовательность.

Контекст: проблема связана с предложением курса EDX, в котором используется R. На одном из форумов было задано вопрос о том, можно ли использовать Python, и персонал ответил, что некоторые задания потребуют установки определенных семян и отправки ответов.

Связанный:

Ответы

Ответ 1

Я понимаю, что это старый вопрос, но я недавно наткнулся на ту же проблему и создал решение, которое может быть полезным для других.

Я написал генератор случайных чисел в C и связал его как с R, так и с Python. Таким образом, случайные числа гарантированно будут одинаковыми на обоих языках, поскольку они генерируются с использованием одного и того же кода C.

Программа называется SyncRNG и может быть найдена здесь: https://github.com/GjjvdBurg/SyncRNG.

Ответ 2

используйте rpy2 для вызова r в python, вот демонстрационный пример, массив numpy data разделяет память с помощью x в R:

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