std:: philox_engine
|
ヘッダーで定義
<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 はシーケンス Q の i 番目の要素を表すものとします。ここで添字はゼロから始まります。
philox_engine
の状態の
サイズ
は
O(n)
であり、各状態は4つの部分で構成されています:
-
整数値のシーケンス
X
で、各値は
[ 0 ,2w
)の範囲内にあります。
-
-
このシーケンスは、大きな符号なし整数カウンター値を表します
Z=∑
n-1
j=0 X⋅2 wj
( n⋅w ビット)。
-
このシーケンスは、大きな符号なし整数カウンター値を表します
Z=∑
n-1
-
n
個の
UIntType型の生成値を持つバッファ Y 。 - Y バッファ内のインデックス j 。
philox_engine
の
遷移アルゴリズム
(
TA(X
i
)
)は以下のように定義されます:
- n 個の新しいランダム値のシーケンスを生成し(下記参照)、それらを Y に格納します。
- カウンタ Z を 1 だけインクリメントします。
- j を 0 にリセットします。
philox_engine
の
生成アルゴリズム
は
GA(X
i
)=Y
j
です。
ランダム値の生成
ランダム値は以下のパラメータから生成されます:
- ラウンド数 r
- 現在のカウンターシーケンス X
- キーシーケンス K
- 乗数シーケンス M
- ラウンド定数シーケンス C
シーケンス
M
と
C
は、テンプレートパラメータパック
consts
の値から形成され、これは
M
k
および
C
k
定数を
[
M
0
,
C
0
,
M
1
,
C
1
,... , ...,
M
n/2-1
,
C
n/2-1
]
として表します。
乱数は以下のプロセスによって生成されます:
- 出力シーケンス S を X の要素で初期化します。
- S の要素を r ラウンド分更新します。
- バッファ Y の値を S の値で置き換えます。
出力シーケンスの更新
各更新ラウンドにおいて、中間シーケンス V は S の要素を指定された順序で初期化されます:
| n | V 0 | V 1 | V 2 | V 3 |
|---|---|---|---|---|
| 2 | S 0 | S 1 | 該当なし | |
| 4 | S 2 | S 1 | S 0 | S 3 |
以下の操作表記が与えられた場合:
- xor 、組み込みの ビット単位XOR 。
-
mullo
、これはモジュラー乗算の下位半分を計算し、
mullo(a,b,w)=(a⋅b) mod 2
w
として定義されます。 -
mulhi
、これは乗算の上位半分を計算し、
mulhi(a,b,w)=⌊(a⋅b)/2
w
⌋ として定義されます。
現在のラウンド番号(0から開始)を
q
とし、各整数
k
が
[
0
,
n
/
2
)
の範囲にあるとき、出力シーケンス
S
の要素は以下のように更新されます:
-
X
2⋅k
=mulhi(V
2⋅k
,M
k
,w) xor ((K
k
+q⋅C
k
) mod 2
w
) xor V 2⋅k+1 - X 2⋅k+1 =mullo(V 2⋅k ,M k ,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
(公開静的メンバ定数) |
メンバー関数
構築とシード設定 |
|
|
エンジンを構築する
(公開メンバ関数) |
|
|
エンジンの現在の状態を設定する
(公開メンバ関数) |
|
|
エンジンの現在のカウンタを設定する
(公開メンバ関数) |
|
生成 |
|
|
エンジンの状態を進め、生成された値を返す
(公開メンバ関数) |
|
|
指定された量だけエンジンの状態を進める
(公開メンバ関数) |
|
特性 |
|
|
[static]
|
出力範囲で最小の可能な値を取得する
(公開静的メンバ関数) |
|
[static]
|
出力範囲で最大の可能な値を取得する
(公開静的メンバ関数) |
非メンバー関数
|
(C++26)
|
二つの擬似乱数生成エンジンの内部状態を比較する
(関数) |
|
(C++26)
|
擬似乱数生成エンジンに対するストリーム入出力を実行する
(関数テンプレート) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_philox_engine
|
202406L
|
(C++26) |
std::philox_engine
|
例
|
このセクションは不完全です
理由: 例がありません |