最終更新日時:
が更新

履歴 編集

typedef
<random>

std::mt19937(C++11)

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

概要

パラメータ設定済みの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

処理系