Класс генератора случайных чисел Singleton всегда генерирует одинаковую последовательность целых чисел - PullRequest
0 голосов
/ 28 марта 2020

Класс RandomGenerator предназначен для предоставления одного экземпляра generator для использования различными объектами. Текущая реализация предоставляет метод getInstance для получения одного экземпляра класса и метод getGenerator, который также должен предоставлять единственный экземпляр generator. Проблема с этой реализацией состоит в том, что предоставленная последовательность чисел всегда одинакова на разных ПК.

RandomGenerator.cpp

#include "RandomGenerator.h"

RandomGenerator::RandomGenerator() : generator(std::random_device()()) {}

RandomGenerator *RandomGenerator::getInstance() {
    std::call_once(inited, [&]{
        instance = new RandomGenerator();
    });
    return instance;
}

std::mt19937& RandomGenerator::getGenerator() {
    return generator;
}

RandomGenerator.h

#include <mutex>
#include <random>

class RandomGenerator {
private:

    inline static RandomGenerator* instance;
    inline static std::once_flag inited;
    std::mt19937 generator;

    RandomGenerator();
public:
    static RandomGenerator* getInstance();
    std::mt19937& getGenerator();
};
...