隨機數種子(random seed) | IT人
文章推薦指數: 80 %
隨機數種子(random seed) ... 在科學技術和機器學習等其他演算法相關任務中,我們經常需要用到隨機數,為了把握隨機數的生成特性,從隨機數的隨機無序中獲得 ...
Togglenavigation
IT人
IT人
隨機數種子(randomseed)
geeks_reign發表於
2021-07-26
在科學技術和機器學習等其他演算法相關任務中,我們經常需要用到隨機數,為了把握隨機數的生成特性,從隨機數的隨機無序中獲得確定和秩序。
我們可以利用隨機數種子(randomseed)來實現這一目標,隨機數種子,可以使得引入了隨機數的整個程式,在多次執行中得到確定的,一致的結果。
很多博文談到隨機數種子,只是簡單論及,利用隨機數種子,可以每次生成相同的隨機數。
想真正用好掌握它,對此很容易產生疑惑,生成相同的隨機數數怎麼個相同法?隨機數種子又作何用處?
1.隨機數種子
下面我們從例項中揭開隨機數種子的神祕面紗:
importrandom
#print(help(random))
deftest_random_seed_in_std_lib(seed=0,cnt=3):
random.seed(seed)
print("testseed:",seed)
for_inrange(cnt):
print(random.random())
print(random.randint(0,100))
print(random.uniform(1,10))
print('\n')
test_random_seed_in_std_lib()
testseed:0
0.8444218515250481
97
9.01219528753418
0.04048437818077755
65
5.373349269065314
0.9182343317851318
38
9.710199954281542
test_random_seed_in_std_lib()
testseed:0
0.8444218515250481
97
9.01219528753418
0.04048437818077755
65
5.373349269065314
0.9182343317851318
38
9.710199954281542
test_random_seed_in_std_lib(99)
testseed: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中的隨機數種子作進一步的擴充研究。
2.numpy中的隨機數種子
importnumpyasnp
deftest_numpy_random_seed(seed=0,cnt=3):
np.random.seed(seed)
print("testnumpyseed:",seed)
for_inrange(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模組時相似的情形,進一步驗證了我們總結的關於隨機數種子的特性。
此外,我們可以對多維隨機陣列做一些有益的探索:
deftest_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.764052350.400157210.97873798]]
[[2.24089321.86755799]]
[[1.764052350.400157210.978737982.24089321.86755799]
[-0.977277880.95008842-0.15135721-0.103218850.4105985]]
執行test_mult_shape函式,我們發現,設定相同的隨機陣列,兩次執行兩個一行的多維正態分佈的結果,與一次執行兩行的多維正態分佈的結果的第一行完全相同。
這個結果,說明了對相同型別的隨機數分佈,形狀特徵不會影響分佈的生成秩序,程式中,np.random.randn(1,2),這一行不像是第二次執行多維正態分佈的隨機陣列,它"幾乎"是字尾於它的前一行一次性生成的。
3.隨機數“順序”的奧祕
至此,我們對隨機數生成順序有了初步印象,但是這裡的順序,其實比我們的樸素觀察更復雜,我們來進一步考察這一點。
deftest_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.741591741.55291372-2.26832821.33354538-0.84272405]]
[[1.764052350.400157210.978737982.24089321.86755799]
[-0.977277880.95008842-0.15135721-0.103218850.4105985]]
執行以上程式,我們看到,設定了相同的隨機數種子,np.random.randn(1,5)看起來是第一次執行多維正態分佈陣列,實際上並不是,np.random.randn(2,5)才是真正的第一次執行多維正態分佈隨機陣列。
這說明,前面的np.random.random()對np.random.randn產生了干擾,使得這次正態分佈的隨機陣列中的任何一個數,都不在np.random.randn(2,5)中,這樣它顯示了一種不可把握的隨機性。
我們可以把這一點考察得更加深入一點:
deftest_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.118496460.113967790.370255381.04053075-1.51698273]]
[[1.764052350.400157210.978737982.24089321.86755799]
[-0.977277880.95008842-0.15135721-0.103218850.4105985]]
test_numpy_random_seed_order_further(randint_high=5)
1
[[1.122794920.302805220.070859260.07304142-1.42232584]]
[[1.764052350.400157210.978737982.24089321.86755799]
[-0.977277880.95008842-0.15135721-0.103218850.4105985]]
緊接上面對隨機數干擾項對考察,我們看到,這次我們改變了干擾項隨機數生成器,np.random.randn(1,5)的生成結果不同於test_numpy_random_seed_order中同一行的執行結果。
另外,兩次設定不同的randint的右邊界,np.random.randn(1,5)生成的結果也全然不同,這說明了np.random.randint設定不同的引數,即是全然不同的隨機數發生器。
這一點,也不難在其他型別的隨機數分佈中得到驗證。
相關文章
ML《決策樹(四)Bagging和RandomForest》
2021-01-02
決策樹
一個隨機數的類c++
2021-01-03
C++
[機器學習]RandomForest、GBDT、XGBoost、lightGBM原理與區別
2021-01-04
MachineLearning
用Python的random模組繪製折線圖
2021-01-04
Python
【CLP】GaussianProjectionReduction&RandomizedBinaryReduction
2021-01-05
RandomForest隨機森林演算法與模型引數的調優
2021-01-19
演算法隨機森林
[javaIO流]之隨機訪問檔案(RandomAccessFile類)
2021-02-10
Java
封裝不同類别範本的隨機數生成器
2021-02-21
LaravelSeeder生成百萬模擬資料
2021-03-24
Laravel
LevelDB原始碼解析之Random隨機數
2021-03-30
蒙特卡洛——使用CDF反函式生成非均勻隨機數
2021-04-16
從零開始系列-Laravel編寫api服務介面:4.Migration和Seed
2021-05-12
Laravel
[論文閱讀筆記]Communityawarerandomwalkfornetworkembedding
2021-05-30
Unity
Python-random庫的詳細使用
2021-06-03
Python
SpringBoot基礎學習(三)自定義配置、隨機數設定及引數間引用
2021-06-04
Spring
Ta想做一粒智慧的種子
2021-07-13
laravelseed生成測試資料
2021-07-15
Laravel
最新文章
CMR:印度手機遊戲調查報告
大咖說·圖書分享|HaaS物聯網裝置雲端一體開發框架
話實踐,行實幹,成實事:“巡禮”數字化的中國大地
構建安全程式碼防止供應鏈攻擊
【推薦閱讀】超有用的漏洞掃描工具合集!
國密SM演算法有哪些?
為什麼伺服器選擇Linux系統
ApacheFlinkML2.1.0釋出公告
乾貨|作為前端開發者如何邁向獨立開發者
助力開發者,全方位解讀APISIX測試案例
得物資料庫中介軟體平臺“彩虹橋”演進之路
KubeSphere3.3.0離線安裝教程
延伸文章資訊
- 1随机种子_百度百科
- 2你的程式夠「亂」嗎? | iThome
而在API文件會指出,rand()預設的亂數種子是0,可使用srand()來設定亂數種子,一個常見做法是在使用rand()前,先執行srand(time(NULL)),也就是利用時間來 ...
- 3偽隨機性- 維基百科,自由的百科全書 - Wikipedia
... 种子 int rand(void) // 生成伪随机数 { next = next * 1103515245 + 12345; return (unsigned int) (next /...
- 4random --- 生成偽隨機數— Python 3.10.5 說明文件
幾乎所有module 函式都相依於基本函式 random() ,此函式在半開放範圍[0.0, ... 3.9 版後已棄用: 將來,seed 必須是以下型別之一:NoneType、 int 、 f...
- 5Python seed() 函数| 菜鸟教程
注意:seed()是不能直接访问的,需要导入random 模块,然后通过random 静态对象调用该方法。 参数. x -- 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设 ...