random.seed (): Ne işe yarar?


177

random.seed()Python'da neler olduğu konusunda biraz kafam karıştı . Örneğin, aşağıdaki denemeler neden yaptıklarını yapıyor (sürekli olarak)?

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

Bu konuda iyi bir belge bulamadım.


30
Rastgele sayı üretimi gerçekte "rastgele" değildir. Deterministiktir ve ürettiği sekans, geçtiğiniz tohum değeri ile belirlenir random.seed. Genellikle çağırırsınız random.seed()ve geçerli zamanı tohum değeri olarak kullanır, yani komut dosyasını her çalıştırdığınızda farklı bir değer dizisi elde edersiniz.
Asad Saeeduddin

3
Aynı tohumun rasgele geçirilmesi ve ardından çağrılması size aynı sayıları verecektir. Bu amaçlandığı gibi çalışıyor ve sonuçların her seferinde farklı olmasını istiyorsanız, bir uygulamayı her başlattığınızda farklı bir şeyle tohumlamak zorunda kalacaksınız (örneğin / dev / random veya zaman çıktısı)
Tymoteusz Paul

5
Tohum, ilk rastgele sayıyı oluşturmak için RNG'ye beslenen şeydir. Bundan sonra, RNG kendi kendine beslenir. Bu yüzden aynı cevabı sürekli görmüyorsunuz. Bu komut dosyasını tekrar çalıştırırsanız, aynı "rasgele" sayılar dizisini alırsınız. Sonuçları yeniden oluşturmak istiyorsanız, tohumun ayarlanması faydalıdır, çünkü üretilen tüm "rastgele" sayılar her zaman aynı olacaktır.
Göz

Bahsetmeye değer: Bu gönderide gösterilen dizi Python 2'de. Python 3 farklı bir dizi verir.
ggorlen

1
@Blink'in "rasgele sayı" kullanımı yanıltıcıdır. RNG kendi kendine beslenen bir dahili duruma sahiptir. Bu iç durumdan randım (1,10) ve diğer çağrılar için çıktı elde edilir. RNG, randımanın (1,10) çıkışından besleniyorsa, sekans en fazla 10 sekanstan birine düşecek ve sekans en fazla 10 sayıdan sonra tekrarlanacaktır.
Joachim Wagner

Yanıtlar:


213

Yalancı rasgele sayı üreteçleri, bir değer üzerinde bazı işlemler gerçekleştirerek çalışır. Genellikle bu değer jeneratör tarafından üretilen bir önceki sayıdır. Ancak, jeneratörü ilk kez kullandığınızda önceki bir değer yoktur.

Yalancı rasgele bir sayı üretecinin ekilmesi ona ilk "önceki" değerini verir. Her tohum değeri, belirli bir rasgele sayı üreteci için üretilen değerlerin bir dizisine karşılık gelir. Yani, aynı tohumu iki kez sağlarsanız, aynı sayı dizisini iki kez alırsınız.

Genellikle, rastgele sayı üretecinizi programın her yürütülmesini değiştirecek bir değerle tohumlamak istersiniz. Örneğin, şimdiki zaman sık kullanılan bir tohumdur. Bunun otomatik olarak yapılmamasının nedeni, isterseniz, bilinen bir sayı dizisi elde etmek için belirli bir tohum sağlayabilmenizdir.


39
Bazen tohum vermek istediğimizi söyleyebiliriz, böylece programın her çalışmasında aynı rastgele sıra üretilir. Bazen, program davranışını belirleyici tutmak ve sorunları / hataları yeniden üretme olasılığını korumak için yazılım programlarındaki / programlarındaki rastgelelikten kaçınılır.
ViFI

1
@ViFI'nin söylediklerini takiben, program davranışını belirleyici (sabit bir tohumla veya sabit bir tohum dizisiyle) tutmak, programınızdaki bazı değişikliklerin yararlı olup olmadığını daha iyi değerlendirmenize izin verebilir.
shaneb

bazı gerçek hayat senaryosu ile açıklar mısın? Bunun için bir kullanım durumunu anlayamıyorum. Diğer programlama dilinde de buna benzer bir şey var mı?
Shashank Vivek

1
İşte gerçek hayat senaryosu: stackoverflow.com/questions/5836335/… . Rastgele tohumlar da araştırma için tekrarlanabilir sonuçlar oluşturmak için yaygındır. Örneğin, bir veri bilimcisiyseniz ve sonuçlarınızı rastgele kullanan (örneğin rastgele bir orman) bir tür modelle yayınlamak istiyorsanız, yayınlanan kodunuza bir tohum eklemek istersiniz, böylece kullanıcılar hesaplamalar tekrarlanabilir.
Galen Long

89

Diğer tüm cevaplar random.seed () kullanımını açıklamıyor gibi görünüyor. İşte basit bir örnek ( kaynak ):

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

Bunu sen dene.

Diyelim ki 'random.seed' bu değerleri bu tohum temelinde üreten rastgele değer üretecine ('random.randint ()') bir değer veriyor. Rasgele sayıların olmazsa olmaz özelliklerinden biri, tekrarlanabilir olmalarıdır. Aynı tohumu koyduğunuzda, aynı rastgele sayılar desenini alırsınız. Bu şekilde onları en başından üretiyorsunuz. Farklı bir tohum verirsiniz - farklı bir başlangıçla başlar (3'ün üzerinde).

Bir tohum verildiğinde, birbiri ardına 1 ile 10 arasında rastgele sayılar üretecektir. Bir tohum değeri için bir sayı kümesi olduğunu varsayarsınız.


15

Bir rastgele sayı , önceki değerine bir işlem ile üretilir.

Önceden bir değer yoksa, otomatik olarak önceki değer olarak geçerli saat. Bu önceki değeri, herhangi bir sayı veya dize vb. Olabilecek random.seed(x)yerleri kullanarak kendi başımıza xsağlayabiliriz.

Bu random.random()yüzden aslında mükemmel rasgele sayı değildir, üzerinden tahmin edilebilir 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

Bu nedenle, rastgele bir sayı üretmek aslında rastgele değildir, çünkü algoritmalar üzerinde çalışır. Algoritmalar her zaman aynı girdiye göre aynı çıktıyı verir. Bu, tohumun değerine bağlı olduğu anlamına gelir. Böylece, daha rastgele hale getirmek için zaman otomatik olarak atanır 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))

Yukarıdaki programı birden çok kez yürütün ...

1. deneme: 1-100 aralığında 5 rastgele tam sayı yazdırır

2. deneme: yukarıdaki yürütmede aynı 5 rasgele sayıyı yazdırır.

3. deneme: aynı

.....Yakında

Açıklama: Yukarıdaki programı her çalıştırdığımızda tohumu 10'a ayarlıyoruz, o zaman rasgele üretici bunu bir referans değişkeni olarak alıyor. Ve sonra önceden tanımlanmış bir formül yaparak rastgele bir sayı üretir.

Bu nedenle, bir sonraki yürütmede tohumu 10'a ayarlamak referans numarasını tekrar 10'a ayarlar ve yine aynı davranış başlar ...

Tohum değerini sıfırlar sıfırlamaz aynı bitkileri verir.

Not: Tohum değerini değiştirin ve programı çalıştırın, öncekinden farklı bir rastgele sıra göreceksiniz.


7

Bu durumda, rastgele aslında sahte-rastgele. Bir tohum verildiğinde, eşit dağılımlı sayılar üretecektir. Ancak aynı tohumla, her seferinde aynı sayı dizisini üretecektir. Eğer değişmesini istiyorsanız tohumunuzu değiştirmeniz gerekecek. Birçok insan şimdiki zamana veya başka bir şeye dayalı bir tohum üretmeyi sever.


6

Imho, tekrar kullandığınızda aynı rastgele ders sonucunu oluşturmak için kullanılır 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)Rastgele sayılar kümesi oluşturmadan önce ayarlayın ve aynı rastgele sayılar kümesini oluşturmak için aynı çekirdeği kullanın. Sorunların yeniden üretilmesi durumunda kullanışlıdır.

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

İşte benim anlayışım. Her bir tohum değeri ayarladığımızda, bir "etiket" veya "referans" oluşturulur. Bir sonraki random.function çağrısı bu "label" öğesine eklenir, böylece bir sonraki aynı tohum değerini ve random.function çağırdığınızda size aynı sonucu verir.

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()Yöntemi aynı argümanla beslemenin aynı sahte rasgele sonuca neden olacağını gösteren küçük bir test :

# 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
Daha kısa eşitlik kontrolü:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)python'da yalancı rasgele sayı üretecini (PRNG) başlatmak için kullanılır .

PRNG, rasgele sayıların özelliklerine yaklaşan sayı dizisi üreten algoritmadır. Bu rasgele sayılar tohum değeri kullanılarak çoğaltılabilir . Bu nedenle, tohum değeri verirseniz, PRNG bir tohum kullanarak keyfi bir başlangıç ​​durumundan başlar.

Tartışma a tohum değeridir. A değeri Nonevarsayılan olarak geçerli sistem saati olarak kullanılır.

ve versiona parametresinin bir tam sayıya nasıl dönüştürüleceğini belirten bir tamsayıdır. Varsayılan değer 2'dir.

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

Aynı rastgele sayının çoğaltılmasını istiyorsanız aynı tohumu tekrar sağlayın

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

Eğer tohum vermezseniz, daha önce olduğu gibi 1 değil farklı bir sayı üretir.

random.randint(1, 10) # this gives 7 without providing seed
# 7

Öncekinden farklı tohumlar sağlarsanız , size farklı bir rasgele sayı verecektir.

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

Yani, özet olarak, aynı rastgele sayının çoğaltılmasını istiyorsanız, tohumu sağlayın. Özellikle, aynı tohum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.