random.seed(): Что это делает?
Я немного запутался в том, что random.seed()
делает в Python. Например, почему приведенные ниже испытания делают то, что они делают (последовательно)?
>>> import random
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
7
Я не мог найти хорошую документацию по этому вопросу. Заранее спасибо!
10 ответов
Генераторы псевдослучайных чисел работают, выполняя некоторую операцию со значением. Обычно это значение является предыдущим числом, сгенерированным генератором. Однако при первом использовании генератора предыдущее значение отсутствует.
Заполнение генератора псевдослучайных чисел дает ему первое "предыдущее" значение. Каждое начальное значение будет соответствовать последовательности сгенерированных значений для данного генератора случайных чисел. То есть, если вы предоставите одно и то же начальное число дважды, вы получите одинаковую последовательность чисел дважды.
Как правило, вы хотите заполнить свой генератор случайных чисел некоторым значением, которое изменит каждое выполнение программы. Например, текущее время является часто используемым семенем. Причина, по которой это не происходит автоматически, заключается в том, что при желании вы можете указать конкретное начальное число для получения известной последовательности чисел.
Все остальные ответы не объясняют использование random.seed(). Вот простой пример ( источник):
import random
random.seed( 3 )
print "Random number with seed 3 : ", random.random() #will generate a random number
#if you want to use the same random number once again in your program
random.seed( 3 )
random.random() # same random number as before
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9002)
>>> random.randint(1, 10)
3
Ты попробуй это. Допустим, "random.seed" задает значение для генератора случайных значений ("random.randint()"), который генерирует эти значения на основе этого начального числа. Одним из обязательных свойств случайных чисел является то, что они должны быть воспроизводимыми. После того, как вы положили то же самое семя, вы получите тот же шаблон случайных чисел. Таким образом, вы генерируете их с самого начала снова. Вы даете другое семя, оно начинается с другого инициала (выше 3).
Вы дали семя, теперь оно будет генерировать случайные числа от 1 до 10 один за другим. Таким образом, вы можете принять один набор чисел для одного начального значения.
Случайное число генерируется некоторой операцией над предыдущим значением.
Если предыдущего значения нет, то текущее время автоматически переводится как предыдущее значение. мы можем предоставить это предыдущее значение самостоятельно random.seed(x)
где x может быть любым числом или строкой и т. д.
следовательно random.random()
на самом деле не является идеальным случайным числом, это может быть предсказано с помощью random.seed(x)
,
import random
random.seed(45) #seed=45
random.random() #1st rand value=0.2718754143840908
0.2718754143840908
random.random() #2nd rand value=0.48802820785090784
0.48802820785090784
random.seed(45) # again reasign seed=45
random.random()
0.2718754143840908 #matching with 1st rand value
random.random()
0.48802820785090784 #matching with 2nd rand value
Следовательно, генерация случайного числа на самом деле не случайна, потому что она работает на алгоритмах. Алгоритмы всегда дают один и тот же вывод на основе одного и того же ввода. Это означает, что это зависит от стоимости семени. Таким образом, чтобы сделать его более случайным, время автоматически присваивается seed()
,
Seed() can be used for later use ---
Example:
>>> import numpy as np
>>> np.random.seed(12)
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
>>>
>>> np.random.seed(12) # When you use same seed as before you will get same random output as before
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
#Simple python programme to understand random.seed() importance
import random
random.seed(10)
for i in range(5):
print(random.randint(1,100))
Выполните вышеуказанную программу несколько раз....
1 -я попытка: печатает 5 случайных чисел в диапазоне от 1 до 100
2-я попытка: печатает те же 5 случайных чисел, которые появились в приведенном выше исполнении
3-я попытка: то же самое
.....Скоро
Объяснение: Каждый раз, когда мы запускаем вышеуказанную программу, мы устанавливаем начальное значение в 10, а затем генератор случайных чисел принимает это в качестве ссылочной переменной. А затем, выполнив некоторую предопределенную формулу, он генерирует случайное число.
Следовательно, установка seed в 10 при следующем выполнении снова устанавливает номер ссылки на 10, и снова начинается то же самое поведение....
Как только мы сбрасываем значение семени, оно дает те же растения.
Примечание: измените начальное значение и запустите программу, вы увидите случайную последовательность, отличную от предыдущей.
В этом случае случайное на самом деле является псевдослучайным. Учитывая семя, оно будет генерировать числа с равным распределением. Но с одним и тем же начальным числом он будет каждый раз генерировать одну и ту же последовательность чисел. Если вы хотите, чтобы это изменилось, вам придется изменить свое семя. Многим людям нравится создавать семена, основанные на текущем времени или чем-то подобном.
Имхо, он используется для генерации того же результата случайного курса, когда вы используете random.seed(samedigit)
снова.
In [47]: random.randint(7,10)
Out[47]: 9
In [48]: random.randint(7,10)
Out[48]: 9
In [49]: random.randint(7,10)
Out[49]: 7
In [50]: random.randint(7,10)
Out[50]: 10
In [51]: random.seed(5)
In [52]: random.randint(7,10)
Out[52]: 9
In [53]: random.seed(5)
In [54]: random.randint(7,10)
Out[54]: 9
Установить seed(x)
прежде чем генерировать набор случайных чисел и использовать то же начальное число для генерации того же набора случайных чисел. Полезно в случае воспроизведения вопросов.
>>> from random import *
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>>
Вот мое понимание. Каждый раз, когда мы устанавливаем начальное значение, генерируется "метка" или "ссылка". Следующий вызов random.function присоединяется к этой "метке", поэтому в следующий раз, когда вы вызовете то же самое начальное значение и random.function, он даст вам тот же результат.
np.random.seed( 3 )
print(np.random.randn()) # output: 1.7886284734303186
np.random.seed( 3 )
print(np.random.rand()) # different function. output: 0.5507979025745755
np.random.seed( 5 )
print(np.random.rand()) # different seed value. output: 0.22199317108973948
random.seed(a, version)
в Python используется для инициализации генератора псевдослучайных чисел (PRNG).
PRNG - это алгоритм, который генерирует последовательность чисел, приближающую свойства случайных чисел. Эти случайные числа можно воспроизвести с помощью начального значения. Итак, если вы указываете начальное значение, ГПСЧ запускается из произвольного начального состояния с использованием начального значения.
Аргумент a
- начальное значение. Если значение aNone
, то по умолчанию используется текущее системное время.
а также version
- целое число, определяющее, как преобразовать параметр в целое число. Значение по умолчанию - 2.
import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1
Если вы хотите, то же самое случайное число, которое будет воспроизводиться затем обеспечить такое же семя снова
random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1
Если вы не предоставите начальное число, оно будет генерировать другое число, а не 1, как раньше.
random.randint(1, 10) # this gives 7 without providing seed
# 7
Если вы укажете другое начальное число, чем раньше, оно даст вам другое случайное число.
random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5
Итак, если вы хотите воспроизвести одно и то же случайное число, укажите начальное число. Конкретно то же семя.
Вот небольшой тест, который показывает, что кормление seed()
Метод с тем же аргументом вызовет тот же псевдослучайный результат:
# testing random.seed()
import random
def equalityCheck(l):
state=None
x=l[0]
for i in l:
if i!=x:
state=False
break
else:
state=True
return state
l=[]
for i in range(1000):
random.seed(10)
l.append(random.random())
print "All elements in l are equal?",equalityCheck(l)