簡體   English   中英

random.seed():它有什么作用?

[英]random.seed(): What does it do?

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

我找不到這方面的好文檔。

偽隨機數生成器通過對值執行一些操作來工作。 通常,此值是生成器生成的前一個數字。 但是,第一次使用生成器時,沒有以前的值。

為偽隨機數生成器做種子會為其提供第一個“前一個”值。 每個種子值將對應於給定隨機數生成器的一系列生成值。 也就是說,如果您提供相同的種子兩次,您將獲得兩次相同的數字序列。

通常,您希望為隨機數生成器設置一些值,該值會改變程序的每次執行。 例如,當前時間是一個經常使用的種子。 這不會自動發生的原因是,如果您願意,您可以提供特定的種子來獲得已知的數字序列。

所有其他答案似乎都沒有解釋 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 program to understand random.seed() importance

import random

random.seed(10)

for i in range(5):    
    print(random.randint(1, 100))

多次執行上述程序...

第一次嘗試:打印 1 - 100 范圍內的 5 個隨機整數

第二次嘗試:打印上述執行中出現的相同的 5 個隨機數。

第三次嘗試:相同

.....很快

解釋:每次我們運行上面的程序時,我們都將種子設置為 10,然后隨機生成器將其作為參考變量。 然后通過執行一些預定義的公式,它會生成一個隨機數。

因此,在下一次執行中將種子設置為 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)用於初始化偽隨機數生成器 (PRNG)

PRNG 是生成近似隨機數屬性的數字序列的算法。 可以使用種子值復制這些隨機數 因此,如果您提供種子值,PRNG 將從使用種子的任意起始狀態開始。

參數a是種子值。 如果 a 值為None ,則默認使用當前系統時間。

version是一個整數,指定如何將 a 參數轉換為整數。 默認值為 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM