Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

Генератор случайных чисел std::mt19937 из всегда выдает одно и то же число

Здравствуйте. Мне нужно создать функцию, которая возвращала бы случайное число. Чуть ниже можно посмотреть, как я это пробовал реализовать. Ошибок нет, число есть, проблема в том, что число это всегда одно и тоже. Ну и как вы уже вероятно догадались, вопрос в том, как мне исправить данную ситуацию? Желательно с примером.
int TestClass::returnRandom(int max){ std::random_device randD; std::mt19937 randMT(randD()); std::uniform_int_distribution range(0, max); return range(randMT); }


Ответ

Проблема в том, что randMT каждый раз создается заново.
std::mt19937 - это генератор псевдослучайных чисел, для получения последовательности чисел его надо создать один раз, и потом использовать его вместе с каким-то случайным распределением чтобы получать случайные числа.
По этому его надо сделать членом класса:
class TestClass { public: TestClass() { std::random_device device; random_generator_.seed(device()); }
int returnRandom(int max) { std::uniform_int_distribution range(0, max); return range(random_generator_); }
private: std::mt19937 random_generator_; };
Если класс создается много раз и часто, то есть смысл создавать объект std::random_device не в конструкторе, а где-то еще, т.к. его создание тоже может быть медленной операцией.
Также объект std::mt19937 можно инициализировать текущим временем. Однако это слабый источник энтропии, потому что у текущего времени очень мало случайных бит.
auto now = std::chrono::high_resolution_clock::now(); random_generator_.seed(now.time_since_epoch().count());

Комментариев нет:

Отправить комментарий