2014-03-25 60 views
72

我在Python中做什麼random.seed()有點困惑。例如,爲什麼下面的試驗能夠做到(一致)?random.seed():它做什麼?

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

我在這找不到很好的文檔。提前致謝!

+11

隨機數字的生成不是真正的「隨機」。它是確定性的,它產生的序列是由你傳入「random.seed」的種子值決定的。通常你只需調用random.seed(),它使用當前時間作爲種子值,這意味着每當你運行腳本時,你將得到不同的值序列。 –

+0

將相同的種子傳遞給隨機,然後調用它會給你相同的一組數字。這是按預期工作的,如果你希望每次你啓動一個應用程序時(例如從/ dev/random或time的輸出),每次你必須使用不同的結果,結果會不同。 –

+0

種子是什麼送到RNG產生第一個隨機數。在那之後,他們RNG是自給自足的。由於這個原因,你並沒有看到相同的答案。如果您再次運行此腳本,您將獲得相同的「隨機」數字序列。如果您想重現結果,設置種子會很有幫助,因爲所有生成的「隨機」數字總是相同的。 – Blink

回答

91

僞隨機數發生器通過對某個值執行一些操作而工作。通常這個值是由發生器生成的以前的數字。但是,第一次使用發生器時,沒有以前的值。

播種一個僞隨機數發生器給它它的第一個「前一個」值。每個種子值將對應於給定隨機數發生器的一系列生成值。也就是說,如果你提供兩次相同的種子,你會得到兩次相同的數字序列。

一般來說,你想給你的隨機數發生器播種一些值,這會改變程序的每一次執行。例如,當前時間是一個常用的種子。這種情況不會自動發生的原因是,如果你願意,你可以提供一個特定的種子來獲得一個已知的數字序列。

+5

可能值得一提的是,有時我們想給種子,以便在程序的每次運行中生成相同的隨機序列。有時,避免軟件程序中的隨機性,以保持程序行爲的確定性和再現問題/錯誤的可能性。 – ViFI

4

在這種情況下,隨機實際上是僞隨機的。給定一個種子,它會產生一個平均分配的數字。但是使用相同的種子,每次都會產生相同的數字序列。如果你想改變它,你必須改變你的種子。很多人喜歡根據當前時間或某物產生種子。

45

所有其他答案似乎沒有解釋random.seed()的使用。 下面是一個簡單的例子(source):

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

[編輯] – MartinM

+0

@MartinM,當我在閱讀「Learning Python,5th Edition強大的面向對象編程」時,我認爲他們做了很好的解釋。之後,我在google上進行了大量搜索,並嘗試手動運行代碼,最後通過觀察輸出結果讓我瞭解代碼的功能。希望這有助於幫助 –

+0

@RiteshKarwa,你的代碼是從鏈接中獲取的是Martin所說的。這是一個直接複製/粘貼。 –

0

這裏是一個小的測試,證明了餵養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) 
+0

較短的平等檢查:'len(set(l))<= 1' –

13
>>> 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之間的隨機數。所以你可以假定一個數字爲一個種子值。

2

Imho,當您再次使用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 
2
#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個的隨機整數 - 100

第二嘗試:打印相同的5張隨機數出現在上面的執行中。

第三嘗試:同

.....於是就

說明:每一次我們正在運行我們設置種子10上面的程序,然後隨機數發生器以此爲參考variable.And然後通過做一些預定義的公式,它會生成一個隨機數。

在未來執行因此結籽10再次將參考號碼爲10,再相同的行爲開始....

只要我們重置種子值也給出了同樣的植物。

注意:更改種子值並運行程序,您將看到與上一個不同的隨機序列。

相關問題