Почему модули numpy и random дают разные случайные числа для одного и того же семени?

Для одного и того же семени, почему random.random () производит разные случайные значения по сравнению с numpy.random (). Насколько я понимаю, они оба используют Mersenne Twister для генерации случайных значений.

import random as rnd
import numpy as np

rnd.seed(1)
np.random.seed(1)

rnd.random()
np.random.rnd()

0.13436...

0.41702...


person Aegir    schedule 09.03.2018    source источник
comment
Почему вы ожидаете, что они будут такими же? Даже если оба используют один и тот же алгоритм, могут быть небольшие различия в реализации. Например, может отличаться то, как отображается семя и как оно используется.   -  person Ignacio Vergara Kausel    schedule 09.03.2018
comment
Например, MATLAB будет выдавать идентичные значения Numpy при запросе случайных чисел с использованием того же начального числа. Мне любопытно, почему случайный модуль стандартной библиотеки этого не делает.   -  person Aegir    schedule 09.03.2018


Ответы (1)


И модуль random, и numpy.random используют mt19937 для генерации случайных чисел. Из-за этого мы можем скопировать состояние одного из одного генератора в другой, чтобы увидеть, имеют ли они одну и ту же базовую реализацию.

import random as rnd
import numpy as np

# seed numpy
np.random.seed(1)

# get state from numpy
state = [int(s) for s in list(np.random.get_state()[1])]
state.append(624)
state = tuple(state)
state = (3, tuple(state), None)

# set state for python 
rnd.setstate(state)

print(rnd.random())
print(np.random.rand())

0.417022004702574

0.417022004702574

Похоже, что используемый движок mt19937 дает эквивалентные результаты, если вручную установить такое же состояние. Похоже, это означает, что начальная функция реализована по-другому.

person alexdor    schedule 09.03.2018
comment
Интересно, спасибо за это. Не в полной мере оценил состояния между двумя - person Aegir; 09.03.2018