std::philox_engine
從 cppreference.com
在標頭 <random> 定義
|
||
template< class UIntType, std::size_t w, std::size_t n, std::size_t r, |
(C++26 起) | |
std::philox_engine
是一個基於計數器的隨機數生成引擎。
目錄 |
[編輯] 模板形參
UIntType | - | 生成器所生成的結果類型。如果它不是 unsigned short、unsigned int、unsigned long 或 unsigned 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,
2
w
)
中。
- 此序列用來表示一個 n⋅w 位的無符號整數計數器 Z=∑n-1
j=0X⋅2wj
。
- 此序列用來表示一個 n⋅w 位的無符號整數計數器 Z=∑n-1
- 包含 n / 2 個
UIntType
類型鍵的序列 K。 - 包含 n 個
UIntType
類型生成值的緩衝區 Y。 - 緩衝區 Y 中的索引 j。
philox_engine
的變換算法(TA(xi))定義如下:
- 生成包含 n 個隨機值的新序列(見下文),並將這些值存儲在 Y 中。
- 使計數器 Z 增加 1。
- 重置 j 為 0。
philox_engine
的生成算法是 GA(Xi)=Yj。
[編輯] 生成隨機值
隨機數通過以下參數生成:
- 狀態更新輪數 r
- 當前計數器序列 X
- 鍵序列 K
- 乘數序列 M
- 輪次常量序列 C
序列 M 和 C 以形參包 consts 中的值組成,各 Mk 和 Ck 常量以 [
M0,
C0,
M1,
C1,... , ...,
Mn/2-1,
Cn/2-1]
的形式表示。
隨機數按以下流程生成:
- 以 X 中的元素初始化輸出序列 S。
- 將 S 中的元素更新 r 輪。
- 以 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 為當前輪數(從零開始),對 [
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 (公開靜態成員常量) |
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 (公開靜態成員常量) |
[編輯] 成員函數
構造與播種 | |
構造引擎 (公開成員函數) | |
設置引擎的當前狀態 (公開成員函數) | |
設置引擎的當前計數器 (公開成員函數) | |
生成 | |
推進引擎狀態並返回生成的值 (公開成員函數) | |
令引擎狀態前進指定量 (公開成員函數) | |
特徵 | |
[靜態] |
獲取輸出範圍中的最小可能值 (公開靜態成員函數) |
[靜態] |
獲取輸出範圍中的最大可能值 (公開靜態成員函數) |
[編輯] 非成員函數
(C++26) |
比較兩個偽隨機數引擎的內部狀態 (函數) |
(C++26) |
執行偽隨機數引擎的流輸入和輸出 (函數模板) |
[編輯] 註解
功能特性測試宏 | 值 | 標準 | 功能特性 |
---|---|---|---|
__cpp_lib_philox_engine |
202406L |
(C++26) | std::philox_engine
|
[編輯] 示例
本節未完成 原因:暫無示例 |