Страницы

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

суббота, 21 декабря 2019 г.

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

#cpp #cpp11


Здравствуйте. Мне нужно создать функцию, которая возвращала бы случайное число. Чуть
ниже можно посмотреть, как я это пробовал реализовать. Ошибок нет, число есть, проблема
в том, что число это всегда одно и тоже. Ну и как вы уже вероятно догадались, вопрос
в том, как мне исправить данную ситуацию? Желательно с примером.

int TestClass::returnRandom(int max){
std::random_device randD;
std::mt19937 randMT(randD());
std::uniform_int_distribution  range(0, max);
return range(randMT);
}

    


Ответы

Ответ 1



Проблема в том, что 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());

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

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