怎樣理解隨機種子

2021-09-23 16:58:11 字數 3757 閱讀 2155

在使用numpy時,難免會用到隨機數生成器。我一直對np.random.seed(),隨機數種子搞不懂。很多部落格也就粗略的說,利用隨機數種子,每次生成的隨機數相同。

我有兩個疑惑:1, 利用隨機數種子,每次生成的隨機數相同。這是什麼意思?

2,隨機數種子的引數怎麼選擇?在別人的**中經常看到np.random.seed(argument),這個引數不一樣,有的是0,有的是1,當然還有其他數。那這個引數應該怎麼選擇呢?

通過對別的部落格的理解,我做了以下幾組實驗:

1.以np.random.randn()函式為例

import numpy as np

if __name__ == '__main__':

i = 0

while(i<6):

if(i<3):

np.random.seed(0)

print(np.random.randn(1, 5))

else:

print(np.random.randn(1, 5))

pass

i += 1

i = 0

while(i<2):

print(np.random.randn(1, 5))

i += 1

print(np.random.randn(2, 5))

np.random.seed(0)

i = 0

while(i

print(np.random.randn(1, 5))

i += 1

結果:

[[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]

[[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]

[[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]

[[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]

[[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]

[[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]

[[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]

[[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]

[[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]

[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]

[[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]

[[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]

[[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]

[[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]

[[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]

[[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]

[[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]

[[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]

通過該實驗我們可以得到以下結論:

1.1.可以看出,像這篇部落格中提到的,np.random.seed()對後面的隨機數一次有效,而不是一直有效,這種說法是錯誤的。

兩次利用隨機數種子後,即便是跳出迴圈後,生成隨機數的結果依然是相同的。第一次跳出while迴圈後,進入第二個while迴圈,得到的兩個隨機數組確實和加了隨機數種子不一樣。但是,後面的加了隨機數種子的,八次迴圈中的結果和前面的結果是一樣的。說明,隨機數種子對後面的結果一直有影響。隨機種子就是像隨機生成一串順序的數,生成之後這串數的位置、大小是不變的,以np.random.seed(1)為例:

首先輸入np.random.seed(1),生成兩個(1,5)的陣列,只要你不再次輸入np.random.seed(1),那麼一直會隨機的產生資料,當再次輸入np.random.seed(1)時,資料和第一次np.random.seed(1)後產生的資料相同,也就是說只要輸入np.random.seed(1)相當於從這串隨機數的第乙個位置重新開始

1.2.在同樣的隨機種子後第六次的隨機數生成結果,(結果高亮部分),兩行五列的陣列和兩個一行五列的陣列結果相同。說明,在生成多行隨機數組時,是由單行隨機數組組合而成的。

現在我們回答了第乙個疑惑:利用隨機數種子,每次生成的隨機數相同。這是什麼意思? --就是使後面的隨機數按一定的順序生成。

2.

import numpy as np

if __name__ == '__main__':

i = 0

np.random.seed(0)

while(i<3):

print(np.random.randn(1, 5))

i += 1

i = 0

np.random.seed(1)

i = 0

while(i<3):

print(np.random.randn(1, 5))

i += 1

[[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]]

[[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]

[[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]

[[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763]]

[[-2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]]

[[ 1.46210794 -2.06014071 -0.3224172 -0.38405435 1.13376944]]

你可以實驗,在你的電腦上,當隨機數種子引數為0和1時,生成的隨機數和我上面高亮的結果相同。說明該引數指定了乙個隨機數生成的起始位置。每個引數對應乙個位置。並且在該引數確定後,其後面的隨機數的生成順序也就確定了。

所以,現在我們回答了我的第二個疑問:隨機數種子的引數怎麼選擇?我認為隨意,這個引數只是確定一下隨機數的起始位置。

Others 隨機種子

首先,我們來看一段 猜數字小遊戲 include include const int left 1 const int right 100 void guessnumber else if answer target else intmain 我們執行程式,效果如下 我們關掉程式,清理解決方案,然後...

隨機種子講解

在使用numpy時,難免會用到隨機數生成器。我一直對np.random.seed 隨機數種子搞不懂。很多部落格也就粗略的說,利用隨機數種子,每次生成的隨機數相同。我有兩個疑惑 1,利用隨機數種子,每次生成的隨機數相同。這是什麼意思?2,隨機數種子的引數怎麼選擇?在別人的 中經常看到np.random...

隨機種子是什麼

讓我們先來看一段 熟悉一下seed 的使用 import numpy as np num 0 while num 5 np.random.seed 1 print np.random.random num 1 print num1 0 np.random.seed 2 while num1 5 pr...