名前空間
変種
操作

std::philox_engine

From 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 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

[編集] ジェネレータのプロパティ

以下の説明では、添え字がゼロから始まるシーケンス Qi 番目の要素を Qi とします。

philox_engine の状態の サイズO(n) であり、それぞれ4つの部分から構成されます。

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

philox_engine遷移アルゴリズムTA(Xi))は次のように定義されます。

  • jn - 1 でない場合、j1 増分します。[1]
  • jn - 1 の場合、以下の操作を実行します。[2]
  1. (下記参照) n 個の新しい乱数列を生成し、Y に格納します。
  2. カウンタ Z1 増分します。
  3. j0 にリセットします。

philox_engine生成アルゴリズムGA(Xi)=Yj です。

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

[編集] 乱数の生成

乱数は以下のパラメータから生成されます。

  • ラウンド数 r
  • 現在のカウンタシーケンス X
  • キーシーケンス K
  • 乗数シーケンス M
  • ラウンド定数シーケンス C

シーケンス MC は、テンプレートパラメータパック consts の値から形成されます。これは、Mk および Ck 定数を [M0, C0, M1, C1,... , ..., Mn/2-1, Cn/2-1]として表します。

乱数は以下のプロセスで生成されます。

  1. 出力シーケンス SX の要素で初期化します。
  2. r ラウンドにわたって S の要素を更新します。
  3. バッファ 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[0n / 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) [編集]

[編集] 非メンバ関数

2つの擬似乱数エンジンの内部状態を比較します。
(関数) [編集]
疑似乱数エンジンのストリーム入出力を実行
(関数テンプレート) [編集]

[編集] 注釈

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

[編集]

English 日本語 中文(简体) 中文(繁體)