Мне нужно сгенерировать 16-битные псевдослучайные целые числа, и мне интересно, каков наилучший выбор.
Очевидный путь, который приходит мне в голову, заключается в следующем:
std::random_device rd;
auto seed_data = std::array<int, std::mt19937::state_size> {};
std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
std::mt19937 generator(seq);
std::uniform_int_distribution<short> dis(std::numeric_limits<short>::min(),
std::numeric_limits<short>::max());
short n = dis(generator);
Проблема, которую я вижу здесь, состоит в том, что std::mt19937
производит 32-разрядные целые числа без знака, поскольку оно определено так:
using mt19937 = mersenne_twister_engine<unsigned int,
32, 624, 397,
31, 0x9908b0df,
11, 0xffffffff,
7, 0x9d2c5680,
15, 0xefc60000,
18, 1812433253>;
Это означает, что статическое приведение выполнено, и только наименее значимая часть этих 32-разрядных целых чисел используется распределением. Поэтому мне интересно, насколько хороши эти серии псевдослучайных шорт, и у меня нет математических знаний, чтобы ответить на этот вопрос.
Я ожидаю, что лучшим решением было бы использование собственного определенного mersenne_twister_engine
движка для 16-битных целых чисел. Однако я не нашел ни одного упомянутого набора для аргументов шаблона (требования могут быть найдены здесь например). Есть ли?
ОБНОВЛЕНИЕ : Я обновил пример кода с правильной инициализацией для распространения.