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
Передача того ж насіння випадковим чином, а потім його виклик дасть вам однаковий набір чисел. Це працює за призначенням, і якщо ви хочете, щоб результати кожен раз були різними, вам доведеться
підгодовувати

5
Насіння - це те, що подається в RNG для створення першого випадкового числа. Після цього вони RNG самостійно годують. Ви не бачите однакової відповіді через це. Якщо ви знову запустите цей скрипт, ви отримаєте ту саму послідовність "випадкових" чисел. Налаштування насіння корисно, якщо ви хочете відтворити результати, оскільки всі генеровані "випадкові" числа завжди будуть однаковими.
Мигніть

Варто згадати: послідовність, показана в цій публікації, знаходиться в Python 2. Python 3 дає іншу послідовність.
ggorlen

1
@Blink використання "випадкового числа" вводить в оману. РНГ має внутрішній стан, який самостійно годує. З цього внутрішнього стану виводиться вихід для randint (1,10) та інших викликів. Якщо RNG подається з виходу randint (1,10), послідовність згортається до 1 щонайменше 10 послідовностей, і послідовність повторюється після максимум 10 чисел.
Йоахім Вагнер

Відповіді:


213

Генератори псевдовипадкових чисел працюють, виконуючи деяку операцію над значенням. Зазвичай це значення - це попереднє число, що генерується генератором. Однак при першому використанні генератора немає попереднього значення.

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

Як правило, ви хочете закласти генератор випадкових чисел з деяким значенням, яке змінить кожне виконання програми. Наприклад, поточний час є часто використовуваним насінням. Причина, чому це не відбувається автоматично, полягає в тому, що якщо ви хочете, ви можете надати певне насіння, щоб отримати відому послідовність чисел.


39
Можливо, варто згадати, що іноді ми хочемо дати насіння таким чином, щоб однакова випадкова послідовність генерувалася на кожному запуску програми. Іноді уникнення випадкових випадків у програмах (програмах) дозволяє утримати поведінку програми детерміновано та можливість відтворення проблем / помилок.
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 один за одним. Отже, ви припускаєте один набір чисел для одного значення насіння.


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))

Виконати вищевказану програму кілька разів ...

Перша спроба: друкується 5 випадкових цілих чисел у діапазоні 1 - 100

Друга спроба: у вищезазначеному виконанні з'явилося те саме 5 випадкових чисел.

3-я спроба: те саме

..... Так далі

Пояснення: Кожен раз, коли ми запускаємо вищевказану програму, ми встановлюємо насіння 10, то випадковий генератор сприймає це як опорну змінну. І тоді, роблячи якусь заздалегідь задану формулу, вона генерує випадкове число.

Отже, встановивши насіння 10 у наступному виконанні, знову встановлюється контрольний номер до 10, і знову починається така ж поведінка ...

Щойно ми скидаємо значення насіння, воно дає ті самі рослини.

Примітка: Змініть насіннєве значення та запустіть програму, ви побачите іншу випадкову послідовність, ніж попередня.


7

У цьому випадку випадковий насправді є псевдовипадковим. Давши насіння, воно генерує числа з рівним розподілом. Але з тим же насінням воно буде генерувати однакову послідовність чисел щоразу. Якщо ви хочете, щоб це змінилося, вам доведеться змінити своє насіння. Дуже багато людей люблять генерувати насіння на основі поточного часу чи чогось іншого.


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
>>> 

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 - цінність насіння. Якщо значення є 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

Отже, підсумовуючи, якщо ви хочете відтворити однакове випадкове число, надайте насіння. Зокрема, те саме насіння .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.