np.random.seed(0)
делает случайные числа предсказуемыми
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
При сбросе семян (каждый раз) один и тот же набор номеров будет появляться каждый раз.
Если случайное начальное число не сбрасывается, при каждом вызове появляются разные числа:
>>> numpy.random.rand(4)
array([ 0.42, 0.65, 0.44, 0.89])
>>> numpy.random.rand(4)
array([ 0.96, 0.38, 0.79, 0.53])
(псевдо-) случайные числа работают, начиная с числа (начального числа), умножая его на большое число, добавляя смещение, а затем получая по модулю эту сумму. Полученное число затем используется в качестве начального числа для генерации следующего «случайного» числа. Когда вы устанавливаете семя (каждый раз), оно делает то же самое каждый раз, давая вам одинаковые числа.
Если вы хотите, казалось бы, случайные числа, не устанавливайте начальное число. Однако если у вас есть код, использующий случайные числа, которые вы хотите отлаживать, может быть очень полезно установить начальное число перед каждым запуском, чтобы код делал то же самое при каждом запуске.
Чтобы получить наиболее случайные числа для каждого запуска, позвоните numpy.random.seed()
. Это приведет к тому, что numpy установит начальное число на случайное число, полученное из /dev/urandom
или его аналога в Windows, или, если ни один из них не будет доступен, он будет использовать часы.
Для получения дополнительной информации об использовании seed для генерации псевдослучайных чисел см. Википедию .
numpy.random.seed(None)
, он «попытается прочитать данные из / dev / urandom (или аналога Windows), если он доступен, или запитать от часов в противном случае».numpy.random.seed(None)
. Я обновил ответ с этой информацией и ссылкой на документы.seed
, совместимыми.Если вы установите
np.random.seed(a_fixed_number)
каждый раз, когда вызываете другую случайную функцию numpy, результат будет таким же:Однако, если вы просто вызовете его один раз и будете использовать различные случайные функции, результаты все равно будут другими:
источник
np.random
вызовов до тех пор, пока начальное число не будет изменено? Необходимость называть это каждый раз кажется ненужно многословной и легко забываемой.def seed_first(fun, seed=0):
|\tdef wrapped(*args, **kwargs):
|\t\tnp.random.seed(seed)
|\t\treturn fun(*args, **kwargs)
|\treturn wrapped
, а затемfor m in np.random.__all__:
|\tif m != 'seed':
|\t\tsetattr(np.random, m, seed_first(getattr(np.random, m)))
Однако это может привести к очень тонким ошибкам и странному поведению в долгосрочной перспективе. (Замените \ t четырьмя пробелами и |np.random.seed()
Один вызов в начале программы всегда будет приводить к одному и тому же результату ». для того же начального числа, поскольку последующие вызовыnp.random
функций будут детерминировано изменять начальное значение для последующих вызовов. Вызовnp.random.seed()
перед каждым вызовомnp.random
функций, вероятно, приведет к нежелательным результатам.Как уже отмечалось, numpy.random.seed (0) устанавливает случайное начальное число в 0, поэтому псевдослучайные числа, которые вы получаете из случайного числа, начнутся с той же точки. Это может быть полезно для отладки в некоторых случаях. ОДНАКО после некоторого прочтения кажется, что это неправильный путь, если у вас есть потоки, потому что он не безопасен для потоков.
из различий между numpy-random-random-random-random-in-python :
Пример того, как это сделать:
может дать:
Наконец, обратите внимание, что могут быть случаи, когда инициализация в 0 (в отличие от начального числа, в котором не все биты 0) может привести к неравномерному распределению для некоторых первых итераций из-за способа работы xor, но это зависит от алгоритма и выходит за рамки моих текущих забот и объема этого вопроса.
источник
Я использовал это очень часто в нейронных сетях. Хорошо известно, что когда мы начинаем обучение нейронной сети, мы случайным образом инициализируем веса. Модель обучается на этих весах в конкретном наборе данных. После ряда эпох вы получаете обученный набор гирь.
Теперь предположим, что вы хотите снова тренироваться с нуля или передать модель другим, чтобы воспроизвести ваши результаты. Веса будут снова инициализированы случайными числами, которые в основном будут отличаться от предыдущих. Полученные обученные веса после того же числа эпох (сохраняя те же данные и другие параметры), что и ранее, будут отличаться. Проблема в том, что ваша модель больше не воспроизводима, так как каждый раз, когда вы тренируете свою модель с нуля, она предоставляет вам различные наборы весов. Это потому, что модель каждый раз инициализируется различными случайными числами.
Что если каждый раз, когда вы начинаете тренироваться с нуля, модель инициализируется одним и тем же набором случайных весов инициализации? В этом случае ваша модель может стать воспроизводимой. Это достигается с помощью numpy.random.seed (0). Упоминая seed () для определенного числа, вы всегда держитесь за один и тот же набор случайных чисел.
источник
Представьте, что вы показываете кому-то, как кодировать что-то с помощью «случайных» чисел. Используя numy seed, они могут использовать один и тот же номер seed и получать одинаковый набор «случайных» чисел.
Так что это не совсем случайно, потому что алгоритм выплевывает числа, но выглядит как случайно сгенерированная связка.
источник
Случайное начальное число определяет начальную точку, когда компьютер генерирует последовательность случайных чисел.
Например, предположим, что вы хотите сгенерировать случайное число в Excel (примечание: Excel устанавливает предел в 9999 для начального числа). Если вы введете число в поле «Случайное семя» во время процесса, вы сможете снова использовать тот же набор случайных чисел. Если вы ввели «77» в поле и набрали «77» при следующем запуске генератора случайных чисел, Excel отобразит тот же набор случайных чисел. Если вы введете «99», вы получите совершенно другой набор цифр. Но если вы вернетесь к семени 77, то получите тот же набор случайных чисел, с которого вы начали.
Например, «взять число х, добавить 900 + х, а затем вычесть 52». Для запуска процесса необходимо указать начальный номер x (начальное число). Давайте возьмем стартовый номер 77:
Добавить 900 + 77 = 977 Вычесть 52 = 925 Следуя тому же алгоритму, второе «случайное» число будет:
900 + 925 = 1825 вычесть 52 = 1773 Этот простой пример следует шаблону, но алгоритмы генерации компьютерных номеров намного сложнее
источник
Все случайные числа, сгенерированные после установки конкретного начального значения, одинаковы для всех платформ / систем.
источник
В документах Numpy есть хорошее объяснение: https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html это относится к генератору псевдослучайных чисел Мерсенна Твистера . Подробнее об алгоритме здесь: https://en.wikipedia.org/wiki/Mersenne_Twister
источник
Это производит следующий вывод:
array([5, 0, 3, 3, 7])
опять же, если мы запустим один и тот же код, мы получим тот же результат.Теперь, если мы изменим начальное значение с 0 на 1 или другие:
Это приводит к следующему выводу:
array([5 8 9 5 0])
но теперь вывод не такой, как выше.источник
Все ответы выше показывают реализацию
np.random.seed()
в коде. Я постараюсь кратко объяснить, почему это происходит на самом деле. Компьютеры - это машины, которые разработаны на основе заранее определенных алгоритмов. Любой вывод с компьютера является результатом алгоритма, реализованного на входе. Поэтому, когда мы запрашиваем компьютер для генерации случайных чисел, они бывают случайными, но компьютер не просто случайно их подбирает!Поэтому, когда мы пишем,
np.random.seed(any_number_here)
алгоритм выведет определенный набор чисел, который является уникальным для аргументаany_number_here
. Это почти как определенный набор случайных чисел может быть получен, если мы передадим правильный аргумент. Но это потребует от нас знать, как работает алгоритм, что довольно утомительно.Так, например, если я напишу
np.random.seed(10)
определенный набор чисел, который я получу, он останется прежним, даже если я выполню ту же строку через 10 лет, если алгоритм не изменится.источник