Python隨機(jī)數(shù)種子(random seed)的使用
在科學(xué)技術(shù)和機(jī)器學(xué)習(xí)等其他算法相關(guān)任務(wù)中,我們經(jīng)常需要用到隨機(jī)數(shù),為了把握隨機(jī)數(shù)的生成特性,從隨機(jī)數(shù)的隨機(jī)無(wú)序中獲得確定和秩序。我們可以利用隨機(jī)數(shù)種子(random seed)來(lái)實(shí)現(xiàn)這一目標(biāo),隨機(jī)數(shù)種子,可以使得引入了隨機(jī)數(shù)的整個(gè)程序,在多次運(yùn)行中得到確定的,一致的結(jié)果。
很多博文談到隨機(jī)數(shù)種子,只是簡(jiǎn)單論及,利用隨機(jī)數(shù)種子,可以每次生成相同的隨機(jī)數(shù)。想真正用好掌握它,對(duì)此很容易產(chǎn)生疑惑,生成相同的隨機(jī)數(shù)數(shù)怎么個(gè)相同法?隨機(jī)數(shù)種子又作何用處?
1. 隨機(jī)數(shù)種子
下面我們從實(shí)例中揭開隨機(jī)數(shù)種子的神秘面紗:
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
通過(guò)兩次運(yùn)行以上程序,我們得到相同的結(jié)果,這說(shuō)明了以下幾點(diǎn):
- 在確定了一次隨機(jī)數(shù)種子后,隨機(jī)數(shù)函數(shù),無(wú)論任何分布任何類型,在多次重復(fù)調(diào)用中(for循環(huán))生成的隨機(jī)數(shù)不同;
- 當(dāng)再次聲明相同的隨機(jī)數(shù)種子時(shí)(第二次調(diào)用test_random_seed_in_std_lib函數(shù),random.seed(seed)這一行),隨機(jī)數(shù)將從“頭”開始, 按相同的順序生成隨機(jī)數(shù)。這里的“頭”,即是random.seed(seed)聲明后,隨機(jī)數(shù)函數(shù)的首次調(diào)用;
- 若指定不同的隨機(jī)數(shù)種子(seed=99),無(wú)論任何隨機(jī)數(shù)函數(shù),生成的隨機(jī)數(shù)將不同于,之前的(隨機(jī)數(shù)種子為0)的運(yùn)行結(jié)果。
- 上面的幾點(diǎn)解釋了隨機(jī)數(shù)種子可以使得每次生成相同隨機(jī)數(shù)的具體含義。這里的相同,其實(shí)還有一種更普遍的內(nèi)涵,即環(huán)境獨(dú)立和跨平臺(tái)。上面的實(shí)驗(yàn),在任何電腦或主機(jī),運(yùn)行以上代碼,可以復(fù)現(xiàn)完全一致的結(jié)果。
以上幾點(diǎn)囊括了隨機(jī)數(shù)種子的基本特性,下面我們來(lái)對(duì)numpy中的隨機(jī)數(shù)種子作進(jìn)一步的拓展研究。
2. numpy中的隨機(jī)數(shù)種子
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')
多次運(yùn)行以上的test_numpy_random_seed函數(shù),你可以觀察到與使用random模塊時(shí)相似的情形,進(jìn)一步驗(yàn)證了我們總結(jié)的關(guān)于隨機(jī)數(shù)種子的特性。
此外,我們可以對(duì)多維隨機(jī)數(shù)組做一些有益的探索:
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 ]]
運(yùn)行test_mult_shape函數(shù),我們發(fā)現(xiàn),設(shè)定相同的隨機(jī)數(shù)組,兩次運(yùn)行兩個(gè)一行的多維正態(tài)分布的結(jié)果,與一次運(yùn)行兩行的多維正態(tài)分布的結(jié)果的第一行完全相同。
這個(gè)結(jié)果,說(shuō)明了對(duì)相同類型的隨機(jī)數(shù)分布,形狀特征不會(huì)影響分布的生成秩序,程序中,np.random.randn(1, 2),這一行不像是第二次運(yùn)行多維正態(tài)分布的隨機(jī)數(shù)組,它"幾乎"是后綴于它的前一行一次性生成的。
3. 隨機(jī)數(shù)“順序”的奧秘
至此,我們對(duì)隨機(jī)數(shù)生成順序有了初步印象,但是這里的順序,其實(shí)比我們的樸素觀察更復(fù)雜,我們來(lái)進(jìn)一步考察這一點(diǎn)。
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 ]]
運(yùn)行以上程序,我們看到,設(shè)定了相同的隨機(jī)數(shù)種子,np.random.randn(1, 5)看起來(lái)是第一次運(yùn)行多維正態(tài)分布數(shù)組,實(shí)際上并不是,np.random.randn(2, 5)才是真正的第一次運(yùn)行多維正態(tài)分布隨機(jī)數(shù)組。
這說(shuō)明,前面的np.random.random()對(duì)np.random.randn產(chǎn)生了干擾,使得這次正態(tài)分布的隨機(jī)數(shù)組中的任何一個(gè)數(shù),都不在np.random.randn(2, 5)中,這樣它顯示了一種不可把握的隨機(jī)性。
我們可以把這一點(diǎn)考察得更加深入一點(diǎn):
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 ]]
緊接上面對(duì)隨機(jī)數(shù)干擾項(xiàng)對(duì)考察,我們看到,這次我們改變了干擾項(xiàng)隨機(jī)數(shù)生成器,np.random.randn(1, 5)的生成結(jié)果不同于test_numpy_random_seed_order中同一行的運(yùn)行結(jié)果。
另外,兩次設(shè)置不同的randint的右邊界,np.random.randn(1, 5)生成的結(jié)果也全然不同,這說(shuō)明了np.random.randint設(shè)置不同的參數(shù),即是全然不同的隨機(jī)數(shù)發(fā)生器。這一點(diǎn),也不難在其他類型的隨機(jī)數(shù)分布中得到驗(yàn)證。
到此這篇關(guān)于Python隨機(jī)數(shù)種子(random seed)的使用的文章就介紹到這了,更多相關(guān)Python隨機(jī)數(shù)種子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
flask中使用藍(lán)圖將路由分開寫在不同文件實(shí)例解析
這篇文章主要介紹了flask中使用藍(lán)圖將路由分開寫在不同文件實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python中的高級(jí)函數(shù)map/reduce使用實(shí)例
這篇文章主要介紹了Python中的高級(jí)函數(shù)map/reduce使用實(shí)例,Python內(nèi)建了map()和reduce()函數(shù),本文就講解如何使用它,需要的朋友可以參考下2015-04-04python PyQt5事件機(jī)制和定時(shí)器原理分析及用法詳解
PyQt為事件處理提供了兩種機(jī)制:高級(jí)的信號(hào)與槽機(jī)制,以及低級(jí)的事件處理機(jī)制,在基于PyQt5的應(yīng)用程序開發(fā)過(guò)程中經(jīng)常會(huì)遇到一些需要循環(huán)執(zhí)行的任務(wù),即定時(shí)多長(zhǎng)時(shí)間任務(wù)循環(huán)一次,本文給大家介紹了python PyQt5事件機(jī)制和定時(shí)器原理和用法,需要的朋友可以參考下2024-07-07python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶端、UDP廣播例子)
UDP,用戶數(shù)據(jù)報(bào)傳輸協(xié)議,它位于TCP/IP協(xié)議的傳輸層,是一種無(wú)連接的協(xié)議,它發(fā)送的報(bào)文不能確定是否完整地到達(dá)了另外一端2014-04-04python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫面的方法詳解
最近在研究目標(biāo)檢測(cè)方面的小東西,需要到對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫面。所以本文來(lái)用Python實(shí)現(xiàn)簡(jiǎn)單的對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫面,感興趣的可以了解一下2023-01-01機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之手寫數(shù)字識(shí)別
這篇文章主要為大家詳細(xì)介紹了機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之手寫數(shù)字識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Python request post上傳文件常見要點(diǎn)
這篇文章主要介紹了Python request post上傳文件常見要點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python數(shù)據(jù)類型之Tuple元組實(shí)例詳解
這篇文章主要介紹了Python數(shù)據(jù)類型之Tuple元組,結(jié)合實(shí)例形式分析了Python元組類型的概念、定義、讀取、連接、判斷等常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-05-05