• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    type-alias
    <random>

    std::mt19937

    namespace std {
      using mt19937 = mersenne_twister_engine<
          uint_fast32_t,
          32, 624, 397, 31,
          0x9908b0df, 11, 0xffffffff, 7,
          0x9d2c5680, 15, 0xefc60000, 18, 1812433253
        >;
    }
    

    概要

    パラメータ設定済みのmersenne_twister_engine
    32ビット版のメルセンヌ・ツイスター。64ビット版はmt19937_64

    19937という名称は、メルセンヌ・ツイスター法によって生成される乱数列の周期から来ている(219937 - 1)。

    要件

    mt19937型オブジェクトをデフォルト構築した場合、10000番目に生成される擬似乱数の値は4123659995であること。

    乱数列の周期

    219937 - 1

    サイズ

    (624 + 1) * sizeof(uint_fast32_t)
    

    メルセンヌ・ツイスターのシフトサイズ(624) + 現在の状態(1)。

    パフォーマンス

    環境によって変動する可能性はあるが、minstd_randminstd_rand0より4倍ほど速い。

    次元

    623次元で一様分布する。

    このトレードオフは、各出力の間(現在の状態と次の状態)の相関関係が、無視できるほどしかないということを意味する。たとえばN次元のランダムなベクトルを生成する場合、各次元の値に相関関係がほぼない状態にできる。

    シード、および生成される値の型

    uint_fast32_t

    予測可能性

    mt19937は、624個の連続した過去の出力履歴があれば、次に出現する値を予測できる。

    参照 : Mersenne Twisterの次に出す値を推測する - 憂鬱な午後のひととき

    #include <iostream>
    #include <random>
    
    int main()
    {
      std::random_device seed_gen;
      std::mt19937 engine(seed_gen());
    
      for (int i = 0; i < 10; ++i) {
        std::uint32_t result = engine();
        std::cout << result << std::endl;
      }
    }
    

    出力例

    187052875
    1658563244
    2429782613
    1877839754
    2940926841
    869137381
    1607700369
    747874684
    3520793428
    1774920624
    

    バージョン

    言語

    • C++11

    処理系