隨機數種子(random seed) | IT人

文章推薦指數: 80 %
投票人數:10人

隨機數種子(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離線安裝教程



請為這篇文章評分?