Пояснение к функции Mersenne Twister init_by_array ()

Я пытаюсь реализовать кроссплатформенную согласованную генерацию случайных чисел с 32-битным начальным числом. Большинство сообщений указывают мне на Mersenne Twister или написания собственной реализации.

В исходном коде < / a> есть функция void init_by_array ().

Единственная цель этой функции - расширить переданное 32-битное семя?

Из ReadMe

init_by_array (init_key, key_length) инициализирует вектор состояния, используя массив init_key [] беззнаковых 32-битных целых чисел длины key_kength. Если key_length меньше 624, то каждый массив 32-битных целых чисел дает отдельный вектор начального состояния. Это полезно, если вам нужно больше места для начального числа, чем 32-битное слово.

Неспособность понять это просто предположение, основанное на последнем предложении.

Кажется, что код работает нормально только с использованием init_genrand () и, похоже, дает стабильные результаты.


person DevilBinder    schedule 07.09.2019    source источник
comment
Это: pcg-random.org/posts/cpp-seeding-surprises. html может быть связано с вашей проблемой.   -  person Bob__    schedule 07.09.2019
comment
@Bob__ Интересное чтение. Особый интерес представляет раздел предсказуемости.   -  person DevilBinder    schedule 08.09.2019
comment
@DevilBinder предсказуемость MT хорошо известна и даже описана в оригинальной статье MT: это часть дизайна.   -  person jherek    schedule 20.11.2020


Ответы (1)


Mersenne Twister имеет 19937 бит пространства состояний, которые он использует для перебора создаваемой им последовательности значений. Если вы инициализируете его 32-битным целым числом, вы ограничиваете его только 2 32 из 2 19937 возможных начальных точек, и существует огромное количество выборочных траекторий что вы никогда не увидите. Функция init_by_array() позволяет вам указать больше битов для начального состояния, что дает возможность достичь любой из траекторий выборки, которые может генерировать MT.

person pjs    schedule 07.09.2019