梅森旋轉演算法 (MT19937)#

class numpy.random.MT19937(seed=None)#

梅森旋轉演算法虛擬亂數產生器的容器。

參數:
seed{None, int, array_like[ints], SeedSequence}, optional

用於初始化 BitGenerator 的種子。如果為 None,則會從作業系統提取新的、不可預測的熵。如果傳遞 intarray_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 中使用,而不會損壞狀態。從位元產生器產生值的程式碼應持有位元產生器的鎖定。

狀態#

state

取得或設定 PRNG 狀態

平行生成#

jumped([jumps])

傳回狀態已跳躍的新位元產生器

擴展#

cffi

CFFI 介面

ctypes

ctypes 介面