Помимо того, что я программист мусора, мой жаргон не до нуля. Я буду стараться изо всех сил, чтобы объяснить себя.
Я реализовал генератор случайных чисел Мерсена твистера, используя 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
Если я хочу сгенерировать случайное число в классе, как мне это сделать без необходимости каждый раз определять объект. Я просто беспокоюсь, что если я буду использовать компьютерные часы, я буду использовать одно и то же семя при каждом запуске (меняется только каждую секунду).
Я правильно объясняю?
заранее спасибо
Случайный объект — это, по сути, информация о состоянии, которую необходимо сохранить. Вы можете использовать все обычные методы: вы можете использовать его как глобальную переменную или передавать как параметр. Если конкретному классу нужны случайные числа, вы можете сохранить 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
}
Других решений пока нет …