<random> generuje cały czas te same liczby

0

Mam klasę z metodą statyczną getRandomValue(**int **minVal, **int **maxVal) którą wywołuję w main.cpp:

RandomGenerator::getRandomValue(0, 10);

Niestety co wywołanie, losowana jest ta sama liczba, co jest nie tak?

#include "RandomGenerator.h"

#include <random>
#include <ctime>

RandomGenerator::RandomGenerator() {}

RandomGenerator::~RandomGenerator() {}

void RandomGenerator::init() {}

int RandomGenerator::getRandomValue(int minVal, int maxVal) {
    int val = 0;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dist(minVal, maxVal);

    val = dist(gen);

    return val;
}
2

Nie powinieneś tworzyć obiektu generatora co wywołanie - przez to jego seed (ustawiany zapewne na podstawie czasu w komputerze) jest cały czas identyczny, gdy odpalasz to w pętli.

5

Prawdopodobnie stosujesz mingw - to jest znany błąd w jego implementacji. Ponadto, tak jak podpowiedział @Patryk27 nie ma sensu wywoływania random_device za każdym losowaniem - jest to potencjalne spowolnienie, a jeśli upierasz się, to nie ma potrzeby korzystać z kolejnego generatora liczb pseudolosowych po drodze.

Obejście tego problemu, które ja stosowałem: (zaadaptowany z https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/ )

thread_local std::mt19937_64 gen = []{
    std::seed_seq seq{
        std::random_device{}(),
        (unsigned)std::time(nullptr)
    };
    return std::mt19937_64{seq};
}();

1 użytkowników online, w tym zalogowanych: 0, gości: 1