Різниця між np.random.seed () та np.random.RandomState ()


80

Я знаю, що, щоб засіяти випадковість numpy.random і мати можливість її відтворити, я повинен:

import numpy as np
np.random.seed(1234)

але що робить np.random.RandomState() ?



2
Ось справді хороша дискусія: stackoverflow.com/questions/5836335/ ... вам дійсно доведеться перебирати коментарі та зауважити, що Роберт Керн - розумний розробник
JohnE

Відповіді:


90

Якщо ви хочете встановити насіння, яке np.random...буде використовувати дзвінки , використовуйте np.random.seed:

np.random.seed(1234)
np.random.uniform(0, 10, 5)
#array([ 1.9151945 ,  6.22108771,  4.37727739,  7.85358584,  7.79975808])
np.random.rand(2,3)
#array([[ 0.27259261,  0.27646426,  0.80187218],
#       [ 0.95813935,  0.87593263,  0.35781727]])

Використовуйте клас, щоб уникнути впливу глобального стану numpy:

r = np.random.RandomState(1234)
r.uniform(0, 10, 5)
#array([ 1.9151945 ,  6.22108771,  4.37727739,  7.85358584,  7.79975808])

І підтримує стан так само, як і раніше:

r.rand(2,3)
#array([[ 0.27259261,  0.27646426,  0.80187218],
#       [ 0.95813935,  0.87593263,  0.35781727]])

Ви можете побачити стан типу "глобального" класу за допомогою:

np.random.get_state()

та вашого власного екземпляра класу з:

r.get_state()

3
Ваша відповідь має сенс. Але як документація не бентежить? This method is called when RandomState is initialized. It can be called again to re-seed the generator.Це нічого не говорить про те, що коли я викликаю цей метод, я впливаю лише на один глобальний екземпляр (або що завгодно), а не на будь-який інший RandomStateекземпляр.
більше

3
Так, я згоден .. numpy.randomДокументація модуля повинна чітко зазначати, що модуль ініціалізується фактично екземпляром RandomState. Але я не можу знайти жодної документації щодо самого модуля.
askewchan

13

np.random.RandomState()будує генератор випадкових чисел. Він не впливає на окремо стоячі функції в np.random, але повинен використовуватися явно:

>>> rng = np.random.RandomState(42)
>>> rng.randn(4)
array([ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986])
>>> rng2 = np.random.RandomState(42)
>>> rng2.randn(4)
array([ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986])

Який вплив це робить на окремо стоячі функції? Я думав, що це створило незалежний екземпляр, як у моїй відповіді.
askewchan

@askewchan: друкарська помилка, я мав на увазі, що це не має жодного ефекту.
Fred Foo

8

random.seed - це метод заповнення контейнера random.RandomState .

з numpy docs:

numpy.random.seed(seed=None)

Посів генератор.

Цей метод викликається при ініціалізації RandomState. Його можна знову викликати для повторного засівання генератора. Детальніше див. У розділі RandomState.

class numpy.random.RandomState

Контейнер для генератора псевдовипадкових чисел Mersenne Twister.


1
Але якщо я зателефоную до RandomState (1234) і створим число з random.uniform (), результати не відтворюються. Для чого використовується такий контейнер, як RandomState?
eran

1
@eran, ти усвідомлюєш, що твістер Мерсенна та рівномірний розподіл - це не одне і те ж? прочитайте це, щоб дізнатись більше про те, що саме є випадковим .
Бруно Гельб

1
@eran, насправді це тому, що ви створюєте черговий екземпляр класу. Дивіться мою відповідь, щоб дізнатись, як ним користуватися.
askewchan

1
Дякую! Я зараз це розумію. Досить прямо вперед. Документація просто не мала належного прикладу. Або у мене була сліпа пляма ...
eran

0

np.random.RandomState () - клас, який надає кілька методів, заснованих на різних розподілах ймовірностей.
np.random.RandomState.seed () - викликається при ініціалізації RandomState ().


Ласкаво просимо до SO! Дякуємо за ваш час, відповідаючи на це запитання. Чи можете ви, будь ласка, надати більше деталей про своє рішення? Наприклад, чому ваше рішення краще прийнятої відповіді? Крім того, на запитання було поставлено відповідь 6 років тому. Під час відповіді обов’язково подивіться на дату вихідного запитання. Будь ласка, прочитайте Як відповісти .
above_c_level
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.