std::philox_engine
From 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 | - | 乱数生成に使用される乗数およびラウンド定数のシーケンス |
以下の値のいずれかが true でない場合、プログラムは不正形式となります。
- sizeof...(consts) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std::numeric_limits<UIntType>::digits
[編集] ジェネレータのプロパティ
以下の説明では、添え字がゼロから始まるシーケンス Q の i 番目の要素を Qi とします。
philox_engine の状態の サイズは O(n) であり、それぞれ4つの部分から構成されます。
- n 個の整数値のシーケンス X。各値は
[0,2w)の範囲にあります。
- これは、n⋅w ビットの大きな符号なし整数カウンタ値 Z=∑n-1
j=0X⋅2wj
を表します。
- これは、n⋅w ビットの大きな符号なし整数カウンタ値 Z=∑n-1
- 型
UIntTypeの n / 2 個のキーのシーケンス K。 - 型
UIntTypeの n 個の生成された値のバッファ 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]として表します。
乱数は以下のプロセスで生成されます。
- 出力シーケンス S を X の要素で初期化します。
- r ラウンドにわたって S の要素を更新します。
- バッファ Y の値を S の値で置き換えます。
[編集] 出力シーケンスの更新
更新の各ラウンドで、中間シーケンス V は指定された順序で S の要素で初期化されます。
| n | V0 | V1 | V2 | V3 |
|---|---|---|---|---|
| 2 | S0 | S1 | N/A | |
| 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 とし、k を [0, n / 2) の整数とします。出力シーケンス 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)
[編集] 事前定義された特殊化
以下の特殊化は、一般的に使用される2つのパラメータセットを持つ乱数エンジンを定義します。
| ヘッダー
<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 [static] |
w (公開静的メンバ定数) |
| constexpr std::size_t word_count [static] |
n (公開静的メンバ定数) |
| constexpr std::size_t round_count [static] |
r (公開静的メンバ定数) |
| constexpr std::array<result_type, word_count / 2> multipliers [static] |
乗数シーケンス M (公開静的メンバ定数) |
| constexpr std::array<result_type, word_count / 2> round_consts [static] |
ラウンド定数シーケンス C (公開静的メンバ定数) |
| constexpr std::uint_least32_t default_seed [static] |
20111115u (公開静的メンバ定数) |
[編集] メンバ関数
構築とシード | |
| エンジンを構築します。 (public member function) | |
| エンジンの現在の状態を設定します。 (public member function) | |
| エンジンの現在のカウンタを設定します。 (public member function) | |
生成 | |
| エンジンの状態を進め、生成された値を返す (public member function) | |
| 指定された量だけエンジンの状態を進めます。 (public メンバ関数) | |
特性 | |
| [static] |
出力範囲の最小値を返します。 (public static member function) |
| [static] |
出力範囲の最大値を返します。 (public static member function) |
[編集] 非メンバ関数
| (C++26) |
2つの擬似乱数エンジンの内部状態を比較します。 (関数) |
| (C++26) |
疑似乱数エンジンのストリーム入出力を実行 (関数テンプレート) |
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_philox_engine |
202406L |
(C++26) | std::philox_engine
|
[編集] 例
| このセクションは未完成です 理由: 例がありません |