梅森旋轉演算法 (MT19937)#
- class numpy.random.MT19937(seed=None)#
梅森旋轉演算法虛擬亂數產生器的容器。
- 參數:
- seed{None, int, array_like[ints], SeedSequence}, optional
用於初始化
BitGenerator
的種子。如果為 None,則會從作業系統提取新的、不可預測的熵。如果傳遞int
或array_like[ints]
,則會將其傳遞給SeedSequence
以衍生初始BitGenerator
狀態。也可以傳入SeedSequence
實例。
說明
MT19937
提供了一個膠囊,其中包含產生雙精度浮點數以及無符號 32 位元和 64 位元整數的函數指標 [1]。這些不能在 Python 中直接使用,必須由Generator
或類似支援低階存取的物件使用。Python 標準函式庫模組 “random” 也包含一個梅森旋轉演算法虛擬亂數產生器。
狀態和播種
MT19937
狀態向量包含一個 624 元素、由 32 位元無符號整數組成的陣列,以及一個介於 0 到 624 之間的單一整數值,用於索引主陣列內的目前位置。輸入種子由
SeedSequence
處理以填滿整個狀態。第一個元素會被重設,使其只有最高有效位元被設定。平行功能
在平行應用程式中使用 BitGenerator 的首選方法是使用
SeedSequence.spawn
方法來取得熵值,並使用這些熵值來產生新的 BitGenerator>>> from numpy.random import Generator, MT19937, SeedSequence >>> sg = SeedSequence(1234) >>> rg = [Generator(MT19937(s)) for s in sg.spawn(10)]
另一種方法是使用
MT19937.jumped
,它會將狀態推進,如同已產生 \(2^{128}\) 個亂數一樣 ([1], [2])。這允許分割原始序列,以便在每個工作程序中使用不同的區段。所有產生器都應鏈接在一起,以確保區段來自相同的序列。>>> from numpy.random import Generator, MT19937, SeedSequence >>> sg = SeedSequence(1234) >>> bit_generator = MT19937(sg) >>> rg = [] >>> for _ in range(10): ... rg.append(Generator(bit_generator)) ... # Chain the BitGenerators ... bit_generator = bit_generator.jumped()
相容性保證
MT19937
保證固定的種子始終產生相同的亂數整數串流。參考文獻
[1] (1,2)Hiroshi Haramoto、Makoto Matsumoto 和 Pierre L’Ecuyer,“Polynomial Space 中線性遞迴的快速跳躍前進演算法”,序列及其應用 - SETA,290–298,2008 年。
[2]Hiroshi Haramoto、Makoto Matsumoto、Takuji Nishimura、François Panneton、Pierre L’Ecuyer,“F2 線性亂數產生器的有效跳躍前進”,INFORMS JOURNAL ON COMPUTING,第 20 卷,第 3 期,2008 年夏季,第 385-390 頁。
- 屬性:
- lock: threading.Lock
鎖定實例,它是共享的,以便相同的位元產生器可以在多個 Generator 中使用,而不會損壞狀態。從位元產生器產生值的程式碼應持有位元產生器的鎖定。
狀態#
取得或設定 PRNG 狀態 |
平行生成#
|
傳回狀態已跳躍的新位元產生器 |