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_rand
やminstd_rand0
より4倍ほど速い。
次元
623次元で一様分布する。
このトレードオフは、各出力の間(現在の状態と次の状態)の相関関係が、無視できるほどしかないということを意味する。たとえばN次元のランダムなベクトルを生成する場合、各次元の値に相関関係がほぼない状態にできる。
シード、および生成される値の型
予測可能性
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;
}
}
xxxxxxxxxx
#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
処理系
- Clang: ??
- GCC: 4.7.2 ✅
- ICC: ??
- Visual C++: ??