У меня возникли проблемы с определением, какой вариант Mersenne Twister C++ 11 обеспечивает. Глядя на статью Matsumoto и Nishimura ACM по адресу Mersenne twister: A 623 Dimensionally Equidistributed Uniform Pseudorandom Number Generator, авторы предоставляют алгоритм, реализацию алгоритма и называют его MT19937
.Какой Mersenne Twister делает C++ 11?
Однако, когда я тестирую одноименный генератор C++ 11 с небольшой программой ниже, я не могу воспроизвести поток, созданный Matsumoto и Nisimura MT19937. Потоки отличаются от самого первого 32-битного слова.
Какой Mersenne Twister предлагает C++ 11?
Программа ниже был запущен на Fedora 22 с использованием GCC, -std=c++11
и ГНУ stdlibc++
.
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;
}
Если вы посмотрите на [заголовок] (http://www.boost.org/doc/libs/release/boost/random/mersenne_twister.hpp) в Boost.Random, они заявляют * Посев из целого числа был изменен в апреле 2005 года для устранения [слабости] (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html) *.Может быть, вы сравниваете результаты публикации, опубликованной до этого изменения? – Praetorian
@Praetorian - Ну, я не уверен, но я не верю в это. Я не использую Boost; скорее, я использую реализацию GNU через libstdC++. – jww
Он использует http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c. IOW, с которым связан @Praetorian. –