Namespaces
Variants

std:: philox_engine

From cppreference.net
ヘッダーで定義 <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 short unsigned int unsigned long 、または unsigned long long のいずれでもない場合、動作は未定義です。
w - ワードサイズ(ビット単位)
n - ワード数
r - ラウンド数
consts - 乱数生成に使用される乗数とラウンド定数のシーケンス

以下の値のいずれかが true でない場合、プログラムは不適格です:

ジェネレータのプロパティ

以下の説明において、 Q i はシーケンス Q i 番目の要素を表すものとします。ここで添字はゼロから始まります。

philox_engine の状態の サイズ O(n) であり、各状態は4つの部分で構成されています:

  • 整数値のシーケンス X で、各値は [ 0 , 2 w
    )
    の範囲内にあります。
  • このシーケンスは、大きな符号なし整数カウンター値を表します Z=∑ n-1
    j=0
    X⋅2 wj
    n⋅w ビット)。
  • n 個の UIntType 型の生成値を持つバッファ Y
  • Y バッファ内のインデックス j

philox_engine 遷移アルゴリズム ( TA(X i ) )は以下のように定義されます:

  • j n - 1 でない場合、 j 1 だけインクリメントする。 [1]
  • j n - 1 である場合、以下の操作を実行する: [2]
  1. n 個の新しいランダム値のシーケンスを生成し(下記参照)、それらを Y に格納します。
  2. カウンタ Z 1 だけインクリメントします。
  3. j 0 にリセットします。

philox_engine 生成アルゴリズム GA(X i )=Y j です。

  1. この場合、次世代生成アルゴリズム呼び出しはバッファ内の次に生成された値を返します。
  2. この場合、バッファが更新され、次世代生成アルゴリズム呼び出しは新しいバッファの最初の値を返します。

ランダム値の生成

ランダム値は以下のパラメータから生成されます:

  • ラウンド数 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 ] として表します。

乱数は以下のプロセスによって生成されます:

  1. 出力シーケンス S X の要素で初期化します。
  2. S の要素を r ラウンド分更新します。
  3. バッファ 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)
**注記**: 提供されたテキストは数学的表記とC++関連の用語(mulhi、mullo、xorなど)を含んでおり、翻訳対象外の要素であるため、上記のHTML構造はそのまま保持されています。数式とコード関連の要素は原文のまま維持されています。

事前定義された特殊化

以下の特殊化は、よく使用される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)
二つの擬似乱数生成エンジンの内部状態を比較する
(関数)
擬似乱数生成エンジンに対するストリーム入出力を実行する
(関数テンプレート)

注記

機能テスト マクロ 標準 機能
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine