Philox 基於計數器的 RNG#

class numpy.random.Philox(seed=None, counter=None, key=None)#

Philox (4x64) 虛擬隨機數產生器的容器。

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

用於初始化 BitGenerator 的種子。如果為 None,則會從作業系統中提取新的、不可預測的熵。如果傳遞 intarray_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 陣列。keyseed 不能同時使用。

註解

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。後者是一個金鑰,它決定了產生的序列。使用不同的金鑰會產生獨立的序列。

輸入 seedSeedSequence 處理以產生金鑰。計數器設定為 0。

或者,可以省略 seed 參數,並直接設定 keycounter

平行功能

在平行應用程式中使用 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

鎖定實例是共享的,因此相同的位元產生器可以在多個產生器中使用,而不會損壞狀態。從位元產生器產生值的程式碼應持有位元產生器的鎖定。

狀態#

state

取得或設定 PRNG 狀態

平行生成#

advance(delta)

推進底層 RNG,如同已發生 delta 次繪製。

jumped([jumps])

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

擴充#

cffi

CFFI 介面

ctypes

ctypes 介面