[英]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.