Philox 基於計數器的 RNG#
- class numpy.random.Philox(seed=None, counter=None, key=None)#
Philox (4x64) 虛擬隨機數產生器的容器。
- 參數:
- seed{None, int, array_like[ints], SeedSequence}, 選用
用於初始化
BitGenerator
的種子。如果為 None,則會從作業系統中提取新的、不可預測的熵。如果傳遞int
或array_like[ints]
,則會將其傳遞給SeedSequence
以導出初始BitGenerator
狀態。也可以傳入SeedSequence
實例。- counter{None, int, array_like}, 選用
要在 Philox 狀態中使用的計數器。可以是 [0, 2**256) 範圍內的 Python 整數(2.x 中的 long)或 4 元素 uint64 陣列。如果未提供,則 RNG 初始化為 0。
- key{None, int, array_like}, 選用
要在 Philox 狀態中使用的金鑰。與
seed
不同,金鑰中的值會直接設定。可以是 [0, 2**128) 範圍內的 Python 整數或 2 元素 uint64 陣列。key 和seed
不能同時使用。
註解
Philox 是一種 64 位元 PRNG,它使用基於較弱(且更快)的加密函數版本的基於計數器的設計 [1]。使用不同金鑰值的實例會產生獨立的序列。Philox 的週期為 \(2^{256} - 1\),並支援以 \(2^{128}\) 的增量任意推進和跳躍序列。這些功能允許生成多個不重疊的序列。
Philox
提供一個膠囊,其中包含產生雙精度浮點數和無符號 32 位元和 64 位元整數的函數指標。這些指標無法在 Python 中直接使用,必須由支援低階存取的Generator
或類似物件使用。狀態和播種
Philox
狀態向量由一個編碼為 4 元素 uint64 陣列的 256 位元值和一個編碼為 2 元素 uint64 陣列的 128 位元值組成。前者是一個計數器,每產生 4 個 64 位元隨機數,計數器就會遞增 1。後者是一個金鑰,它決定了產生的序列。使用不同的金鑰會產生獨立的序列。輸入
seed
由SeedSequence
處理以產生金鑰。計數器設定為 0。或者,可以省略
seed
參數,並直接設定key
和counter
。平行功能
在平行應用程式中使用 BitGenerator 的首選方法是使用
SeedSequence.spawn
方法取得熵值,並使用這些值來產生新的 BitGenerator>>> from numpy.random import Generator, Philox, SeedSequence >>> sg = SeedSequence(1234) >>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]
在平行應用程式中可以使用
Philox
,方法是呼叫jumped
方法來推進狀態,如同已產生 \(2^{128}\) 個隨機數一樣。或者,可以使用advance
以 [0, 2**256) 範圍內的任何正步長推進計數器。使用jumped
時,應鏈結所有產生器,以確保區段來自相同的序列。>>> from numpy.random import Generator, Philox >>> bit_generator = Philox(1234) >>> rg = [] >>> for _ in range(10): ... rg.append(Generator(bit_generator)) ... bit_generator = bit_generator.jumped()
或者,在平行應用程式中可以使用
Philox
,方法是使用一系列不同的金鑰,其中每個實例都使用不同的金鑰。>>> key = 2**96 + 2**33 + 2**17 + 2**9 >>> rg = [Generator(Philox(key=key+i)) for i in range(10)]
相容性保證
Philox
保證固定的seed
始終產生相同的隨機整數串流。參考文獻
[1]John K. Salmon, Mark A. Moraes, Ron O. Dror, 和 David E. Shaw, “Parallel Random Numbers: As Easy as 1, 2, 3,” Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC11), New York, NY: ACM, 2011.
範例
>>> from numpy.random import Generator, Philox >>> rg = Generator(Philox(1234)) >>> rg.standard_normal() 0.123 # random
- 屬性:
- lock: threading.Lock
鎖定實例是共享的,因此相同的位元產生器可以在多個產生器中使用,而不會損壞狀態。從位元產生器產生值的程式碼應持有位元產生器的鎖定。
狀態#
取得或設定 PRNG 狀態 |