隨機抽樣 (numpy.random)#

快速開始#

numpy.random 模組實作了偽隨機數產生器 (PRNG 或 RNG,簡稱 RNG),能夠從各種機率分布中抽取樣本。一般來說,使用者會使用 default_rng 建立 Generator 實例,並呼叫其上的各種方法,以從不同的分布中取得樣本。

>>> import numpy as np
>>> rng = np.random.default_rng()
# Generate one random float uniformly distributed over the range [0, 1)
>>> rng.random()  
0.06369197489564249  # may vary
# Generate an array of 10 numbers according to a unit Gaussian distribution
>>> rng.standard_normal(10)  
array([-0.31018314, -1.8922078 , -0.3628523 , -0.63526532,  0.43181166,  # may vary
        0.51640373,  1.25693945,  0.07779185,  0.84090247, -2.13406828])
# Generate an array of 5 integers uniformly over the range [0, 10)
>>> rng.integers(low=0, high=10, size=5)  
array([8, 7, 6, 2, 0])  # may vary

我們的 RNG 是確定性序列,可以透過指定種子整數來重現其初始狀態。預設情況下,在沒有提供種子的情況下,default_rng 將從作業系統的非確定性資料中為 RNG 播種,因此每次都會產生不同的數字。偽隨機序列在所有實際用途上都是獨立的,至少對於我們偽隨機性最初適用的那些用途而言是如此。

>>> import numpy as np
>>> rng1 = np.random.default_rng()
>>> rng1.random()  
0.6596288841243357  # may vary
>>> rng2 = np.random.default_rng()
>>> rng2.random()  
0.11885628817151628  # may vary

警告

此模組中實作的偽隨機數產生器是為統計建模與模擬而設計的。它們不適用於安全或密碼學用途。有關此類用例,請參閱標準函式庫中的 secrets 模組。

種子應為大的正整數。default_rng 可以接受任何大小的正整數。我們建議使用非常大且獨特的數字,以確保您的種子與其他任何人的種子不同。這是確保您的結果在統計上與他們的結果獨立的良好實務,除非您有意嘗試重現他們的結果。取得此類種子數字的便捷方法是使用 secrets.randbits 來取得任意 128 位元整數。

>>> import numpy as np
>>> import secrets
>>> secrets.randbits(128)  
122807528840384100672342137672332424406  # may vary
>>> rng1 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng1.random()
0.5363922081269535
>>> rng2 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng2.random()
0.5363922081269535

請參閱關於 default_rngSeedSequence 的文件,以取得在特殊情境中控制種子的更進階選項。

Generator 及其相關基礎架構是在 NumPy 1.17.0 版本中引入的。仍然有很多程式碼使用舊版的 RandomState 以及 numpy.random 中的函式。雖然目前沒有計畫移除它們,但我們建議您盡可能轉換到 Generator。這些演算法更快、更彈性,並且未來將獲得更多改進。在大多數情況下,Generator 可以用作 RandomState 的替代品。請參閱 舊版隨機數產生 以取得關於舊版基礎架構的資訊,新功能或差異 以取得關於轉換的資訊,以及 NEP 19 以取得關於轉換的一些理由。

設計#

使用者主要與 Generator 實例互動。每個 Generator 實例都擁有一個 BitGenerator 實例,該實例實作核心 RNG 演算法。BitGenerator 具有有限的職責。它管理狀態,並提供產生隨機雙精度浮點數和隨機無號 32 位元和 64 位元值的功能。

Generator 取得位元產生器提供的串流,並將它們轉換為更有用的分布,例如,模擬常態隨機數值。這種結構允許替代的位元產生器在幾乎沒有程式碼重複的情況下使用。

NumPy 實作了幾個不同的 BitGenerator 類別,這些類別實作了不同的 RNG 演算法。default_rng 目前使用 PCG64 作為預設的 BitGenerator。它比舊版 RandomState 中使用的 MT19937 演算法具有更好的統計特性與效能。請參閱 位元產生器 以取得關於支援的 BitGenerator 的更多詳細資訊。

default_rng 和 BitGenerators 將種子轉換為 RNG 狀態的工作委派給內部的 SeedSequenceSeedSequence 實作了一種複雜的演算法,該演算法介於使用者的輸入和每個 BitGenerator 演算法的內部實作細節之間,每個演算法可能需要不同數量的位元才能達到其狀態。重要的是,它讓您可以使用任意大小的整數和此類整數的任意序列混合在一起,以進入 RNG 狀態。這是建構 平行 RNG 串流的彈性模式 的實用基本元素。

為了向後相容性,我們仍然維護舊版的 RandomState 類別。它繼續預設使用 MT19937 演算法,並且舊的種子繼續重現相同的結果。便利的 numpy.random 中的函式 仍然是單一全域 RandomState 實例上的方法的別名。請參閱 舊版隨機數產生 以取得完整的詳細資訊。請參閱 新功能或差異 以取得 GeneratorRandomState 之間的詳細比較。

平行產生#

包含的產生器可以在許多方面用於平行、分散式應用程式

具有大量平行處理的使用者會想要查閱 使用 PCG64DXSM 升級 PCG64

概念#

功能#

Generator 和 BitGenerators 的原始來源#

此套件是獨立於 NumPy 開發的,並在 1.17.0 版本中整合。原始儲存庫位於 bashtage/randomgen