Mersenne Twister C++ 11のどの種類が提供されているかを判断するのに問題があります。松本、西村ACM論文をMersenne twister: A 623 Dimensionally Equidistributed Uniform Pseudorandom Number Generatorに見ると、著者はアルゴリズムとそのアルゴリズムの実装を提供し、それをMT19937
と呼ぶ。どのMersenne TwisterにC++ 11が提供していますか?
しかし、以下の小さなプログラムでC++ 11の同じ名前のジェネレータをテストすると、私はMatsumotoとNishimuraのMT19937で作成されたストリームを再現できません。ストリームは、生成された最初の32ビットワードとは異なります。
どのMersenne TwisterにC++ 11が提供していますか?
以下のプログラムはGCC、-std=c++11
とGNUのstdlibc++
を使用してのFedora 22で実行しました。
で定義されてからMT19937を見る
std::mt19937 prng(102013);
for (unsigned int i = 0; i <= 625; i++)
{
cout << std::hex << prng();
if(i+1 != 625)
cout << ",";
if(i && i%8 == 0)
cout << endl;
}
Boost.Randomの[header](http://www.boost.org/doc/libs/release/boost/random/mersenne_twister.hpp)を見ると、次のように書かれています。 2005年4月に[弱点](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html)*に対処するために変更されました。その変更が行われる前に公開された論文の結果を比較しているのでしょうか? – Praetorian
@Praetorian - まあ、わかりませんが、私はそう信じていません。私はブーストを使用していません。むしろ、私は 'libstdC++ 'を介してGNUの実装を使用しています。 – jww
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.cを使用しています。 IOW、@Praetorianにリンクされているもの。 –