#cpp #cpp11
Здравствуйте. Мне нужно создать функцию, которая возвращала бы случайное число. Чуть ниже можно посмотреть, как я это пробовал реализовать. Ошибок нет, число есть, проблема в том, что число это всегда одно и тоже. Ну и как вы уже вероятно догадались, вопрос в том, как мне исправить данную ситуацию? Желательно с примером. int TestClass::returnRandom(int max){ std::random_device randD; std::mt19937 randMT(randD()); std::uniform_int_distributionrange(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_distributionrange(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());
Комментариев нет:
Отправить комментарий