Последовательно создайте один и тот же случайный массив - PullRequest
81 голосов
/ 29 апреля 2011

Я жду, пока другой разработчик закончит работу с кодом, который вернет массив np формы (100,2000) со значениями -1,0 или 1.

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

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

r = np.random.randint(3, size=(100, 2000)) - 1

Ответы [ 4 ]

168 голосов
/ 30 апреля 2011

Создайте свой собственный экземпляр numpy.random.RandomState() с выбранным вами семенем.Не используйте numpy.random.seed(), кроме как для работы с негибкими библиотеками, которые не позволяют вам передавать свой собственный экземпляр RandomState.

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])
78 голосов
/ 29 апреля 2011

Просто запустите генератор случайных чисел с фиксированным значением, например,

numpy.random.seed(42)

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

3 голосов
/ 08 ноября 2017

Если вы используете другие функции, зависящие от случайного состояния, вы не можете просто установить и общее начальное значение, но вместо этого следует создать функцию для генерации случайного списка чисел и установить начальное значение в качестве параметра функции. Это не будет мешать другим случайным генераторам в коде:

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)
1 голос
/ 03 февраля 2019

Важно понимать, что является семенем генератора случайных чисел и когда / как он установлен в вашем коде (проверьте, например, здесь , чтобы получить хорошее объяснение математического значения семени).

Для этого вам нужно установить начальное значение, выполнив:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

В таком случае важно генерировать случайные числа из random_state, а не из np.random.Т.е. вы должны сделать:

random_state.randint(...)

вместо

np.random.randint(...) 

, что создаст новый экземпляр RandomState () и в основном использует внутренние часы вашего компьютера для установки начального числа.

...