名稱空間
變體
操作

std::philox_engine

來自 cppreference.com
< cpp‎ | 數值‎ | 隨機
 
 
 
 
 
定義於標頭檔案 <random>
template<

    class UIntType, std::size_t w, std::size_t n, std::size_t r,
    UIntType... consts
>

class philox_engine;
(C++26 起)

std::philox_engine 是一個基於計數器的隨機數引擎。

目錄

[編輯] 模板引數

UIntType - 生成器生成的結果型別。如果它不是 unsigned shortunsigned intunsigned longunsigned long long 之一,則效果未定義。
w - 字長(位元數)
n - 字數
r - 輪數
consts - 用於生成隨機數的乘數和迴圈常數序列

如果以下任何值為 false,則程式格式錯誤

  • sizeof...(consts) == n
  • n == 2 || n == 4
  • 0 < r
  • 0 < w && w <= std::numeric_limits<UIntType>::digits

[編輯] 生成器屬性

在以下描述中,設 Qi 表示序列 Q 的第 i 個元素,下標從零開始。

philox_engine 的狀態 大小O(n),每個狀態由四個部分組成:

  • 一個由 n 個整數值組成的序列 X,每個值在 [0, 2w
    )
    範圍內。
  • 此序列表示一個大的無符號整數計數器值 Z=∑n-1
    j=0
    X⋅2wj
    ,共 n⋅w 位元。
  • 一個由 n / 2UIntType 型別的鍵組成的序列 K
  • 一個由 nUIntType 型別生成的值組成的緩衝區 Y
  • 緩衝區 Y 中的索引 j

philox_engine轉換演算法TA(Xi))定義如下:

  • 如果 j 不是 n - 1,則將 j 增加 1[1]
  • 如果 jn - 1,則執行以下操作:[2]
  1. 生成一個新的 n 個隨機值序列(見下文),並將其儲存在 Y 中。
  2. 將計數器 Z 增加 1
  3. j 重置為 0

philox_engine生成演算法GA(Xi)=Yj

  1. 在此情況下,下一個生成演算法呼叫返回緩衝區中生成的下一個值。
  2. 在此情況下,緩衝區會被重新整理,下一個生成演算法呼叫返回新緩衝區中的第一個值。

[編輯] 生成隨機值

隨機值由以下引數生成:

  • 輪數 r
  • 當前計數器序列 X
  • 金鑰序列 K
  • 乘數序列 M
  • 輪常數序列 C

序列 MC 由模板引數包 consts 中的值構成,表示為 MkCk 常數,形如 [M0, C0, M1, C1,..., ..., Mn/2-1, Cn/2-1]

隨機數透過以下過程生成:

  1. X 的元素初始化輸出序列 S
  2. 更新 S 的元素 r 輪。
  3. 將緩衝區 Y 中的值替換為 S 中的值。

[編輯] 更新輸出序列

對於每輪更新,中間序列 V 以指定順序用 S 的元素初始化

 n   V0   V1   V2   V3 
2 S0 S1 不適用
4 S2 S1 S0 S3

給定以下運算子號:

  • xor,內建的 按位 XOR
  • mullo,計算模乘的低半部分,定義為 mullo(a,b,w)=(a⋅b) mod 2w
  • mulhi,計算乘法的高半部分,定義為 mulhi(a,b,w)=⌊(a⋅b)/2w

q 為當前輪數(從零開始),對於範圍 [0, n / 2) 中的每個整數 k,輸出序列 S 的元素按如下方式更新:

  • X2⋅k=mulhi(V2⋅k,Mk,w) xor ((Kk+q⋅Ck) mod 2w
    ) xor V2⋅k+1
  • X2⋅k+1=mullo(V2⋅k,Mk,w)

[編輯] 預定義特化

以下特化定義了帶有兩組常用引數的隨機數引擎:

定義於標頭檔案 <random>
型別 定義
philox4x32 (C++26) std::philox_engine<std::uint_fast32_t, 32, 4, 10,
                   0xCD9E8D57, 0x9E3779B9,
                   0xD2511F53, 0xBB67AE85>[編輯]
philox4x64 (C++26) std::philox_engine<std::uint_fast64_t, 64, 4, 10,
                   0xCA5A826395121157, 0x9E3779B97F4A7C15,
                   0xD2E7470EE14C6C93, 0xBB67AE8584CAA73B>[編輯]

[編輯] 巢狀型別

型別 定義
result_type UIntType

[編輯] 資料成員

constexpr std::size_t word_size
[靜態]
w
(public static 成員常量)
constexpr std::size_t word_count
[靜態]
n
(public static 成員常量)
constexpr std::size_t round_count
[靜態]
r
(public static 成員常量)
constexpr std::array<result_type, word_count / 2> multipliers
[靜態]
乘數序列 M
(public static 成員常量)
constexpr std::array<result_type, word_count / 2> round_consts
[靜態]
輪常數序列 C
(public static 成員常量)
constexpr std::uint_least32_t default_seed
[靜態]
20111115u
(public static 成員常量)

[編輯] 成員函式

構造與播種
構造引擎
(公有成員函式) [編輯]
設定引擎的當前狀態
(公有成員函式) [編輯]
設定引擎的當前計數器
(公有成員函式) [編輯]
生成
推進引擎狀態並返回生成的值
(公有成員函式) [編輯]
將引擎的狀態推進指定量
(公有成員函式) [編輯]
特性
[靜態]
獲取輸出範圍中的最小可能值
(公有靜態成員函式) [編輯]
[靜態]
獲取輸出範圍中的最大可能值
(公有靜態成員函式) [編輯]

[編輯] 非成員函式

比較兩個偽隨機數引擎的內部狀態
(函式) [編輯]
對偽隨機數引擎執行流輸入和輸出
(函式模板) [編輯]

[編輯] 注意

特性測試 標準 特性
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

[編輯] 示例