Я хотел бы узнать наибольшее значение, которое я могу создать для генератора случайных чисел в c ++. Мой код выглядит следующим образом:
mt19937 myRandomGenerator(seed);
Насколько большой может быть переменная seed? Я заметил, что если значение становится слишком большим, генератор случайных чисел выплевывает ту же последовательность «случайных» чисел. Я хотел бы знать, насколько большим может быть семя без этого.
seed
является std::uint_fast32_t
который обычно просто 32-битный int. Каждое значение в диапазоне [0..2^32)
должны давать разные результаты. Если вы видите одну и ту же последовательность из двух разных начальных значений, то вы либо совершаете ошибку наблюдения, а вводимое вами семя фактически совпадает, либо в вашей реализации стандартной библиотеки есть ошибка.
Подготовьте короткую автономную тестовую программу, демонстрирующую плохое поведение, и опубликуйте ее здесь.
Формулировка вопроса несколько неоднозначна. Можно прочитать вопрос как спрашивающий об этом поведении:
#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
Если это не то поведение, о котором вы спрашиваете, уточните свой вопрос.