C ++ RNG (Mersenne Twister) нуждается в семени - PullRequest
1 голос
/ 02 октября 2011

Я написал класс RNG, который содержит разные алгоритмы, однако он не работает должным образом. Помимо того факта, что я хочу использовать нормальное (а не равномерное) распределение, мой код всегда возвращает одно и то же число (max) или только 2 числа из интервала [min, max]:

std::function<int(int, int)> mt19937 =
    [](int min, int max) -> int {
        std::uniform_int_distribution<int> distribution(min, max);
        std::mt19937 engine;
        engine.seed(time(null));
        auto generator = std::bind(distribution, engine);
        return generator();
    };

Может кто-нибудь объяснить мне, что не хватает, чтобы решить эту загадку? Кроме того, как я могу реализовать нормальное распределение? В прошлый раз я попробовал std::normal_distribution Я не смог ввести границы!

РЕДАКТИРОВАТЬ: Когда я говорю о нормальном распределении, я имею в виду, что результаты ГСЧ вблизи двух границ не должны генерироваться так часто, как среднее значение обоих. Например. посмотрите на графическое представление стандартного распределения Гаусса. Я имею в виду это, потому что он визуализирует вероятности результирующих значений, которые я хочу реализовать / использовать таким образом, если вы понимаете.

1 Ответ

1 голос
/ 02 октября 2011

Обычное распределение - это просто (x - случайное равномерное число):

Normal

Но я вижу кое-что, что может быть проблематичным:

std::uniform_int_distribution<int> distribution(min, max);

Разве это не дает вашему генератору чисел тип int?


Чтобы исправить проблему высева, создайте свой двигатель вне лямбды и запустите его при создании.

ГСЧ использует алгоритм, который производит числа, которые кажутся случайными, но имеют очень большой период повторения (основной момент Твистера Мерсенна).Когда вы начнете, вы даете ГСЧ начальное значение, чтобы начать процесс.Каждый раз, когда вы запрашиваете другое число, оно выплевывает очередную итерацию алгоритма.

Когда вы заполняете каждую итерацию:

time(NULL)

, этот код изменяется только каждую секунду, поэтому, когда вы запрашиваетеновое случайное число, оно будет меняться только каждую секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...