Создание такой же последовательности случайных чисел в 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"]