您好,登錄后才能下訂單哦!
本篇內容介紹了“Python隨機數種子的使用方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1. 隨機數種子
2. numpy中的隨機數種子
3. 隨機數“順序”的奧秘
在科學技術和機器學習等其他算法相關任務中,我們經常需要用到隨機數,為了把握隨機數的生成特性,從隨機數的隨機無序中獲得確定和秩序。我們可以利用隨機數種子(random seed)來實現這一目標,隨機數種子,可以使得引入了隨機數的整個程序,在多次運行中得到確定的,一致的結果。
很多博文談到隨機數種子,只是簡單論及,利用隨機數種子,可以每次生成相同的隨機數。想真正用好掌握它,對此很容易產生疑惑,生成相同的隨機數數怎么個相同法?隨機數種子又作何用處?
下面我們從實例中揭開隨機數種子的神秘面紗:
import random # print(help(random)) def test_random_seed_in_std_lib(seed=0, cnt=3): random.seed(seed) print("test seed: ", seed) for _ in range(cnt): print(random.random()) print(random.randint(0,100)) print(random.uniform(1, 10)) print('\n') test_random_seed_in_std_lib() test seed: 0 0.8444218515250481 97 9.01219528753418 0.04048437818077755 65 5.373349269065314 0.9182343317851318 38 9.710199954281542 test_random_seed_in_std_lib() test seed: 0 0.8444218515250481 97 9.01219528753418 0.04048437818077755 65 5.373349269065314 0.9182343317851318 38 9.710199954281542 test_random_seed_in_std_lib(99) test seed: 99 0.40397807494366633 25 6.39495190686897 0.23026272839629136 17 7.8388969285727015 0.2511510083752201 49 5.777313434770537
通過兩次運行以上程序,我們得到相同的結果,這說明了以下幾點:
在確定了一次隨機數種子后,隨機數函數,無論任何分布任何類型,在多次重復調用中(for循環)生成的隨機數不同;
當再次聲明相同的隨機數種子時(第二次調用test_random_seed_in_std_lib函數,random.seed(seed)這一行),隨機數將從“頭”開始, 按相同的順序生成隨機數。這里的“頭”,即是random.seed(seed)聲明后,隨機數函數的首次調用;
若指定不同的隨機數種子(seed=99),無論任何隨機數函數,生成的隨機數將不同于,之前的(隨機數種子為0)的運行結果。
上面的幾點解釋了隨機數種子可以使得每次生成相同隨機數的具體含義。這里的相同,其實還有一種更普遍的內涵,即環境獨立和跨平臺。上面的實驗,在任何電腦或主機,運行以上代碼,可以復現完全一致的結果。
以上幾點囊括了隨機數種子的基本特性,下面我們來對numpy中的隨機數種子作進一步的拓展研究。
import numpy as np def test_numpy_random_seed(seed=0, cnt=3): np.random.seed(seed) print("test numpy seed: ", seed) for _ in range(cnt): print(np.random.random()) print(np.random.randn(1, 5)) print(np.random.uniform(1, 10, 5)) print('\n')
多次運行以上的test_numpy_random_seed函數,你可以觀察到與使用random模塊時相似的情形,進一步驗證了我們總結的關于隨機數種子的特性。
此外,我們可以對多維隨機數組做一些有益的探索:
def test_mult_shape(seed=0): np.random.seed(seed) print(np.random.randn(1, 3)) print(np.random.randn(1, 2)) np.random.seed(seed) print(np.random.randn(2, 5)) test_mult_shape() [[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 ]]
運行test_mult_shape函數,我們發現,設定相同的隨機數組,兩次運行兩個一行的多維正態分布的結果,與一次運行兩行的多維正態分布的結果的第一行完全相同。
這個結果,說明了對相同類型的隨機數分布,形狀特征不會影響分布的生成秩序,程序中,np.random.randn(1, 2),這一行不像是第二次運行多維正態分布的隨機數組,它"幾乎"是后綴于它的前一行一次性生成的。
至此,我們對隨機數生成順序有了初步印象,但是這里的順序,其實比我們的樸素觀察更復雜,我們來進一步考察這一點。
def test_numpy_random_seed_order(seed=0): np.random.seed(seed) print(np.random.random()) # print(np.random.randint(1, 10)) print(np.random.randn(1, 5)) np.random.seed(seed) print(np.random.randn(2, 5)) test_numpy_random_seed_order() 0.5488135039273248 [[ 0.74159174 1.55291372 -2.2683282 1.33354538 -0.84272405]] [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799] [-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
運行以上程序,我們看到,設定了相同的隨機數種子,np.random.randn(1, 5)看起來是第一次運行多維正態分布數組,實際上并不是,np.random.randn(2, 5)才是真正的第一次運行多維正態分布隨機數組。
這說明,前面的np.random.random()對np.random.randn產生了干擾,使得這次正態分布的隨機數組中的任何一個數,都不在np.random.randn(2, 5)中,這樣它顯示了一種不可把握的隨機性。
我們可以把這一點考察得更加深入一點:
def test_numpy_random_seed_order_further(seed=0, randint_high=10): np.random.seed(seed) print(np.random.randint(1, randint_high)) print(np.random.randn(1, 5)) np.random.seed(seed) print(np.random.randn(2, 5)) test_numpy_random_seed_order_further() 6 [[ 0.11849646 0.11396779 0.37025538 1.04053075 -1.51698273]] [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799] [-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]] test_numpy_random_seed_order_further(randint_high=5) 1 [[ 1.12279492 0.30280522 0.07085926 0.07304142 -1.42232584]] [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799] [-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
緊接上面對隨機數干擾項對考察,我們看到,這次我們改變了干擾項隨機數生成器,np.random.randn(1, 5)的生成結果不同于test_numpy_random_seed_order中同一行的運行結果。
另外,兩次設置不同的randint的右邊界,np.random.randn(1, 5)生成的結果也全然不同,這說明了np.random.randint設置不同的參數,即是全然不同的隨機數發生器。這一點,也不難在其他類型的隨機數分布中得到驗證。
“Python隨機數種子的使用方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。