python(np.random.seed())


轉載博文鏈接:https://blog.csdn.net/weixin_38171245/article/details/99807417

------------恢復內容開始------------

首先顯示一段代碼:

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):
print(np.random.random())
num1 += 1

運行結果:

0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
-------------------------
0.43599490214200376
0.025926231827891333
0.5496624778787091
0.4353223926182769
0.42036780208748903

Process finished with exit code 0

講解:

seed( ) 用於指定隨機數生成時所用算法開始的整數值。 

  1.如果使用相同的seed( )值,則每次生成的隨即數都相同; 

  2.如果不設置這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。 

  3.設置的seed()值僅一次有效

所謂隨機數其實是偽隨機數,所謂的‘偽’,意思是這些數其實是有規律的,只不過因為算法規律太復雜,很難看出來。再厲害的算法,沒有一個初始值,它也不可能憑空造出一系列隨機數來,我們說的種子就是這個初始值。

random隨機數是這樣生成的:我們將這套復雜的算法(是叫隨機數生成器吧)看成一個黑盒,把我們准備好的種子扔進去,它會返給你兩個東西,一個是你想要的隨機數,另一個是保證能生成下一個隨機數的新的種子,把新的種子放進黑盒,又得到一個新的隨機數和一個新的種子,從此在生成隨機數的路上越走越遠。

再看我們的代碼:

第一段代碼把對種子的設置放在了循環里面,每次執行循環都旗幟鮮明地告訴黑盒:“我的種子是1”。那么很顯然:同一個黑盒,同一個種子,自然得到的是同一個隨機數。

第二段代碼把對種子的設置放在了循環外面,他只在第一次循環的時候明確地告訴黑盒:“我的種子是2”。那么也很顯然:從第二次循環開始,黑盒用的就是自己生成的新種子了。

多說一句:因為黑盒是始終如一的,所以只要你沒改變種子,那么你得到的隨機數就不會改變。

沒有特殊需求的話,還是老老實實地用Python自動選擇的種子吧,省心又省力。

 

深入理解:

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

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

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

通過對別的博客的理解,我做了以下幾組實驗:

 

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<8):
        print(np.random.randn(1, 5))
        i += 1

運行結果:

  1.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  2.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  3.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  4.  
    [[ -0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  5.  
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  6.  
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  7.  
    [[ -2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  8.  
    [[ -1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  9.  
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]
  10.  
    [ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  11.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  12.  
    [[ -0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  13.  
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  14.  
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  15.  
    [[ -2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  16.  
    [[ -1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  17.  
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]
  18.  
    [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  19.  
     

  

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

1.1.可以看出,像http://blog.csdn.net/linzch3/article/details/58220569這篇博客中提到的,np.random.seed()對后面的隨機數一次有效,而不是一直有效,這種說法是錯誤的。

兩次利用隨機數種子后,即便是跳出循環后,生成隨機數的結果依然是相同的。第一次跳出while循環后,進入第二個while循環,得到的兩個隨機數組確實和加了隨機數種子不一樣。但是,后面的加了隨機數種子的,八次循環中的結果和前面的結果是一樣的。說明,隨機數種子對后面的結果一直有影響。同時,加了隨機數種子以后,后面的隨機數組都是按一定的順序生成的。

1.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時,生成的隨機數和我上面高亮的結果相同。說明該參數指定了一個隨機數生成的起始位置。每個參數對應一個位置。並且在該參數確定后,其后面的隨機數的生成順序也就確定了。

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

------------恢復內容結束------------

首先顯示一段代碼:

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):
print(np.random.random())
num1 += 1

運行結果:

0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
-------------------------
0.43599490214200376
0.025926231827891333
0.5496624778787091
0.4353223926182769
0.42036780208748903

Process finished with exit code 0

講解:

seed( ) 用於指定隨機數生成時所用算法開始的整數值。 

  1.如果使用相同的seed( )值,則每次生成的隨即數都相同; 

  2.如果不設置這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。 

  3.設置的seed()值僅一次有效

所謂隨機數其實是偽隨機數,所謂的‘偽’,意思是這些數其實是有規律的,只不過因為算法規律太復雜,很難看出來。再厲害的算法,沒有一個初始值,它也不可能憑空造出一系列隨機數來,我們說的種子就是這個初始值。

random隨機數是這樣生成的:我們將這套復雜的算法(是叫隨機數生成器吧)看成一個黑盒,把我們准備好的種子扔進去,它會返給你兩個東西,一個是你想要的隨機數,另一個是保證能生成下一個隨機數的新的種子,把新的種子放進黑盒,又得到一個新的隨機數和一個新的種子,從此在生成隨機數的路上越走越遠。

再看我們的代碼:

第一段代碼把對種子的設置放在了循環里面,每次執行循環都旗幟鮮明地告訴黑盒:“我的種子是1”。那么很顯然:同一個黑盒,同一個種子,自然得到的是同一個隨機數。

第二段代碼把對種子的設置放在了循環外面,他只在第一次循環的時候明確地告訴黑盒:“我的種子是2”。那么也很顯然:從第二次循環開始,黑盒用的就是自己生成的新種子了。

多說一句:因為黑盒是始終如一的,所以只要你沒改變種子,那么你得到的隨機數就不會改變。

沒有特殊需求的話,還是老老實實地用Python自動選擇的種子吧,省心又省力。

 

深入理解:

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

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

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

通過對別的博客的理解,我做了以下幾組實驗:

 

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<8):
        print(np.random.randn(1, 5))
        i += 1

運行結果:

  1.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  2.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  3.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  4.  
    [[ -0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  5.  
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  6.  
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  7.  
    [[ -2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  8.  
    [[ -1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  9.  
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]
  10.  
    [ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  11.  
    [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  12.  
    [[ -0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  13.  
    [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  14.  
    [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  15.  
    [[ -2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  16.  
    [[ -1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  17.  
    [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]
  18.  
    [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  19.  
     

  

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

1.1.可以看出,像http://blog.csdn.net/linzch3/article/details/58220569這篇博客中提到的,np.random.seed()對后面的隨機數一次有效,而不是一直有效,這種說法是錯誤的。

兩次利用隨機數種子后,即便是跳出循環后,生成隨機數的結果依然是相同的。第一次跳出while循環后,進入第二個while循環,得到的兩個隨機數組確實和加了隨機數種子不一樣。但是,后面的加了隨機數種子的,八次循環中的結果和前面的結果是一樣的。說明,隨機數種子對后面的結果一直有影響。同時,加了隨機數種子以后,后面的隨機數組都是按一定的順序生成的。

1.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時,生成的隨機數和我上面高亮的結果相同。說明該參數指定了一個隨機數生成的起始位置。每個參數對應一個位置。並且在該參數確定后,其后面的隨機數的生成順序也就確定了。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM