Правильно заполненный генератор случайных чисел (мерсенновский твистер) Переполнение стека

Помимо того, что я программист мусора, мой жаргон не до нуля. Я буду стараться изо всех сил, чтобы объяснить себя.
Я реализовал генератор случайных чисел Мерсена твистера, используя randomlib.
По общему признанию, я не слишком знаком с тем, как работает генератор случайных чисел в Visual 8 C ++, но я обнаружил, что могу его запустить один раз srand(time(NULL)) в main() и я могу смело использовать rand() в моих других классах.
Твистер Мерсена, который у меня есть, нужен для создания объекта, а затем для посева этого объекта.

#include <RandomLib/Random.hpp>
RandomLib::Random r;        // create random number object
r.Reseed();                 // seed with a "unique" seed
float d = r.FloatN();   // a random in [0,1] rounded to the nearest double

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

Я правильно объясняю?

заранее спасибо

3

Решение

Случайный объект — это, по сути, информация о состоянии, которую необходимо сохранить. Вы можете использовать все обычные методы: вы можете использовать его как глобальную переменную или передавать как параметр. Если конкретному классу нужны случайные числа, вы можете сохранить Random объект как член класса, чтобы обеспечить случайность для этого класса.


C ++ <random> Библиотека аналогична тем, что требует создания объекта как источника случайности / состояния ГСЧ. Это хороший дизайн, потому что он позволяет программе контролировать доступ к состоянию и, например, гарантировать хорошее поведение с несколькими потоками. C ++ <random> Библиотека даже включает в себя алгоритм Mersenne Twister.

Вот пример, показывающий сохранение состояния ГСЧ в качестве члена класса (используя std::mt19937 вместо Random)

#include <random> // for mt19937
#include <algorithm> // for std::shuffle
#include <vector>

struct Deck {
std::vector<Cards> m_cards;
std::mt19937 eng; // save RNG state as class member so we don't have to keep creating one

void shuffle() {
std::shuffle(std::begin(m_cards), std::end(m_cards), eng);
}
};

int main() {
Deck d;
d.shuffle();
d.shuffle(); // this reuses the RNG state as it was at the end of the first shuffle, no reseeding
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]