random.seed (): Что это делает?

177

Я немного запутался в том, что 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

Я не мог найти хорошую документацию по этому вопросу.

Ахаан С. Рунгта
источник
30
Генерация случайных чисел не является «случайной». Он является детерминированным, и последовательность, которую он генерирует, продиктована начальным значением, которое вы передаете random.seed. Обычно вы просто вызываете random.seed(), и оно использует текущее время в качестве начального значения, что означает, что всякий раз, когда вы запускаете скрипт, вы получаете другую последовательность значений.
Асад Саидуддин
3
Если передать то же начальное число случайным образом, а затем вызвать его, вы получите тот же набор чисел. Это работает так, как задумано, и если вы хотите, чтобы результаты каждый раз отличались, вам придется каждый раз запускать приложение с чем-то другим (например, вывод из / dev / random или time)
Tymoteusz Paul
5
Начальное число - это то, что подается в ГСЧ для генерации первого случайного числа. После этого у них ГСЧ питается самостоятельно. Вы не видите тот же самый ответ последовательно из-за этого. Если вы снова запустите этот скрипт, вы получите ту же последовательность «случайных» чисел. Установка начального числа полезна, если вы хотите воспроизвести результаты, поскольку все «случайные» сгенерированные числа всегда будут одинаковыми.
Blink
Стоит упомянуть: последовательность, показанная в этом посте, написана на Python 2. Python 3 дает другую последовательность.
Ггорлен
1
Использование @Blink «случайного числа» вводит в заблуждение. ГСЧ имеет внутреннее состояние с автономным питанием. Из этого внутреннего состояния выводятся randint (1,10) и другие вызовы. Если бы RNG подавал с выхода randint (1,10), последовательность рухнула бы до 1 из не более 10 последовательностей, и последовательность повторялась бы после не более 10 номеров.
Иоахим Вагнер

Ответы:

213

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

Заполнение генератора псевдослучайных чисел дает ему первое «предыдущее» значение. Каждое начальное значение будет соответствовать последовательности сгенерированных значений для данного генератора случайных чисел. То есть, если вы предоставите одно и то же начальное число дважды, вы получите одинаковую последовательность чисел дважды

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

Эрик Финн
источник
39
Может быть, стоит упомянуть, что иногда мы хотим дать seed, чтобы одна и та же случайная последовательность генерировалась при каждом запуске программы. Иногда избегают случайности в программном обеспечении (программах), чтобы сохранить детерминированное поведение программы и возможность воспроизведения проблем / ошибок.
ViFI
1
Следуя тому, что сказал @ViFI, сохранение поведения программы детерминированным (с фиксированным начальным числом или фиксированной последовательностью начальных значений) может также позволить вам лучше оценить, является ли какое-то изменение в вашей программе полезным или нет.
shaneb
Не могли бы вы объяснить с помощью сценария реальной жизни. Я не могу понять вариант использования для того же. Есть ли у нас что-то подобное в другом языке программирования?
Шашанк Вивек
1
Вот сценарий из реальной жизни: stackoverflow.com/questions/5836335/… . Случайные семена также распространены, чтобы создать воспроизводимые результаты для исследования. Например, если вы являетесь специалистом по данным и хотите публиковать результаты с помощью какой-либо модели, в которой используется случайность (например, случайный лес), вам нужно включить начальное число в опубликованный код, чтобы люди могли убедиться, что вы расчеты воспроизводимы.
Гален Лонг
89

Все остальные ответы не объясняют использование 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
Ритеш Карва
источник
33
>>> 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 один за другим. Таким образом, вы принимаете один набор чисел для одного начального значения.

Yogesh
источник
15

Случайное число генерируется какой - либо операции по предыдущему значению.

Если предыдущего значения нет, то текущее время как предыдущее значение автоматически. Мы можем предоставить это предыдущее значение по своему усмотрению, 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().

Абхай Маурья
источник
11
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])
>>>
Гур Бера
источник
11
# Simple Python program 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, и снова начинается то же самое поведение ...

Как только мы сбрасываем значение семени, оно дает те же самые растения.

Примечание: измените начальное значение и запустите программу, вы увидите случайную последовательность, отличную от предыдущей.

Брахма
источник
7

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

suavidas
источник
6

Имхо, он используется для генерации того же результата случайного курса при 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
未来 陆家嘴 顶尖 的 投资 人
источник
4

Установите 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
>>> 
user3221795
источник
3

Вот мое понимание. Каждый раз, когда мы устанавливаем начальное значение, генерируется «метка» или «ссылка». Следующий вызов 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
Вики Мяо
источник
1

Вот небольшой тест, который демонстрирует, что передача 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)

источник
4
Короче проверка на равенство:len(set(l))<=1
Оливер Ни
0

random.seed(a, version)в Python используется для инициализации генератора псевдослучайных чисел (PRNG) .

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

Аргумент a - это начальное значение. Если значение равно a None, то по умолчанию используется текущее системное время.

и 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

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

Сантош
источник