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

履歴 編集

function
<random>

std::mersenne_twister_engine::コンストラクタ(C++11)

explicit mersenne_twister_engine(result_type value = default_seed);  // (1)
mersenne_twister_engine() : mersenne_twister_engine(default_seed) {} // (1) C++20

explicit mersenne_twister_engine(result_type value);                 // (2) C++20

template<class Sseq>
explicit mersenne_twister_engine(Sseq& q);                           // (3)

mersenne_twister_engine(const mersenne_twister_engine& e) = default; // (4)
mersenne_twister_engine(mersenne_twister_engine&& e) = default;      // (5)

概要

  • (1) : デフォルトコンストラクタ。
    • C++17まで : シード値が指定されない場合はデフォルトのシード値 (mersenne_twister_engine::default_seed) で構築される
    • C++20 : デフォルトのシード値 (mersenne_twister_engine::default_seed) で(2)に委譲
  • (2) : シード値を受け取って状態シーケンスを構築する。
  • (3) : シードのシーケンスを受け取って状態シーケンスを構築する。
  • (4) : コピーコンストラクタ。状態シーケンスをコピーする。
  • (5) : ムーブコンストラクタ。

計算量

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

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

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

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

  // (2) シード値を指定して構築
  {
    std::uint32_t seed = std::random_device()();
    std::mt19937 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::mt19937 engine(seq);

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

出力例

3499211612
4275542254
2960779330

バージョン

言語

  • C++11

処理系

参照