最終更新日時(UTC):
が更新

履歴 編集

function
<random>

std::philox_engine::コンストラクタ(C++26)

philox_engine();                           // (1) C++26

explicit philox_engine(result_type value); // (2) C++26

template<class Sseq>
explicit philox_engine(Sseq& q);           // (3) C++26

philox_engine(const philox_engine& e) = default; // (4) C++26
philox_engine(philox_engine&& e) = default;      // (5) C++26

概要

  • (1) : デフォルトコンストラクタ
  • (2) : シード値を受け取って状態シーケンスを構築する
  • (3) : シードのシーケンスを受け取って状態を構築する
  • (4) : コピーコンストラクタ。状態をコピーする
  • (5) : ムーブコンストラクタ

効果

  • (1) : デフォルトのシード値 (default_seed) で(2)に委譲
  • (2) :
    • $K_{0}$ に $ value\ mod\ 2^{w} $ を設定する
    • $K_{0}$ 以外の $X$ と $K$ のすべての要素に値0を設定する
    • $i$ に値としてn-1を設定する
  • (3) :
    • p = ceil(w / 32)、長さn / 2 * pの配列aがあるとして、q.generate(a + 0, a + n / 2 * p)を呼び出す
    • $K$ の各要素k=0, …, n/2-1に、 $ \left(\sum_{j=0}^{p-1}a_{k \cdot p+j} \cdot 2^{32j}\right)\ mod\ 2^{w} $ を設定する
    • $X$ のすべての要素に値0を設定する
    • $i$ に値としてn-1を設定する

計算量

  • (1), (2), (3) : 状態のサイズ n に対し O(n)
  • (5) : 状態シーケンスの要素数はコンパイル時に決定されるため、多くの場合状態シーケンスはスタック上(配列)に作られる。そのため、ムーブが効果的に動作することは期待できない

#include <iostream>
#include <random>
#include <array>

int main()
{
  // (1) デフォルト構築
  // デフォルトのシード値(default_seed静的メンバ変数)から構築する
  {
    std::philox4x32 engine;

    std::uint32_t result = engine();
    std::cout << result << std::endl;
  }

  // (2) シード値を指定して構築
  {
    std::uint32_t seed = std::random_device{}();
    std::philox4x32 engine{seed};

    std::uint32_t result = engine();
    std::cout << result << std::endl;
  }

  // (3) シードのシーケンスを指定して構築
  {
    // シードのシーケンスを作る
    std::random_device seed_gen;
    std::array<std::uint32_t, 100> seeds;

    for (std::uint32_t& x : seeds) {
      x = seed_gen();
    }

    std::seed_seq seq(seeds.begin(), seeds.end());

    // シードのシーケンスを指定してエンジンを初期化
    std::philox4x32 engine{seq};

    std::uint32_t result = engine();
    std::cout << result << std::endl;
  }
}

出力例

349899751
1721219710
1841229489

バージョン

言語

  • C++26

処理系