std::philox_engine

從 cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
 
在標頭 <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,其中每個值都在 [02w
    ) 中。
  • 此序列用來表示一個 n⋅w 位的無符號整數計數器 Z=∑n-1
    j=0
    X⋅2wj
  • 包含 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. 重置 j0

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. S 中的值替換緩衝區 Y 中的值。

[編輯] 更新輸出序列

在每輪更新中,都會以 S 中的元素按以下順序初始化中間序列 V 中的元素:

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

給定以下操作表示:

  • xor,內建的逐位異或
  • mullo,它計算模乘法結果的低半區的值,定義為 mullo(a,b,w)=(a⋅b) mod 2w
  • mulhi,它計算乘法結果的高半區的值,定義為 mulhi(a,b,w)=⌊(a⋅b)/2w
    .

q 為當前輪數(從零開始),對 [0n / 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
(公開靜態成員常量)
constexpr std::size_t word_count
[靜態]
n
(公開靜態成員常量)
constexpr std::size_t round_count
[靜態]
r
(公開靜態成員常量)
constexpr std::array<result_type, word_count / 2> multipliers
[靜態]
乘數序列 M
(公開靜態成員常量)
constexpr std::array<result_type, word_count / 2> round_consts
[靜態]
輪次常量序列 C
(公開靜態成員常量)
constexpr std::uint_least32_t default_seed
[靜態]
20111115u
(公開靜態成員常量)

[編輯] 成員函數

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

[編輯] 非成員函數

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

[編輯] 註解

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

[編輯] 示例