c ++ 11 — самое большое возможное семя для переполнения стека Mersenne Twister

Я хотел бы узнать наибольшее значение, которое я могу создать для генератора случайных чисел в c ++. Мой код выглядит следующим образом:

mt19937 myRandomGenerator(seed);

Насколько большой может быть переменная seed? Я заметил, что если значение становится слишком большим, генератор случайных чисел выплевывает ту же последовательность «случайных» чисел. Я хотел бы знать, насколько большим может быть семя без этого.

0

Решение

seed является std::uint_fast32_t который обычно просто 32-битный int. Каждое значение в диапазоне [0..2^32) должны давать разные результаты. Если вы видите одну и ту же последовательность из двух разных начальных значений, то вы либо совершаете ошибку наблюдения, а вводимое вами семя фактически совпадает, либо в вашей реализации стандартной библиотеки есть ошибка.

Подготовьте короткую автономную тестовую программу, демонстрирующую плохое поведение, и опубликуйте ее здесь.

3

Другие решения

Формулировка вопроса несколько неоднозначна. Можно прочитать вопрос как спрашивающий об этом поведении:

#include <random>
#include <iostream>

int
main()
{
std::mt19937 eng1(4294967296);
for (int i = 0; i < 10; ++i)
std::cout << eng1() << '\n';
std::cout << '\n';
std::mt19937 eng2(0);
for (int i = 0; i < 10; ++i)
std::cout << eng2() << '\n';
}

Мой компилятор выдает предупреждение, на которое следует обратить внимание:

test.cpp:7:23: warning: implicit conversion from 'long' to 'result_type' (aka 'unsigned int') changes value from 4294967296 to 0 [-Wconstant-conversion]
std::mt19937 eng1(4294967296);
~~~~ ^~~~~~~~~~
1 warning generated.

Если это то, что вы видите, это потому, что

static_cast<std::mt19937::result_type>(4294967296) == 0

Если это не то поведение, о котором вы спрашиваете, уточните свой вопрос.

2

По вопросам рекламы [email protected]