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