Я создаю несколько тысяч объектов в моей программе на основе функции С++ rand(). Хранение их в памяти было бы исчерпывающим. Есть ли способ скопировать семя CURRENT rand() в любой момент времени? Это даст мне возможность хранить ТОЛЬКО текущие семена, а не полные объекты. (таким образом, я мог бы регенерировать эти объекты, регенерируя точно такие же подпоследовательности случайных чисел)
Исчерпывающее решение - это хранение полной последовательности случайных чисел, заданных функцией rand() - не стоит. Другим решением будет реализация моего собственного класса для рандомизированных чисел.
Google не дал мне никаких положительных подсказок. Существуют сотни статей, посвященных основам rand и srand, и я не мог найти конкретных.
Кто-нибудь знает другие генераторы случайных чисел с внедренным мастером-перехватчиком?
Спасибо за ваши быстрые ответы! Есть более возможные ответы/решения по этому вопросу, поэтому я составил список ваших ответов здесь.
SOLUTIONS:
-
Короткий ответ: нет стандартного способа получить семя
-
Самое близкое возможное обходное решение - сохранить начальное семя в начале и подсчитать, сколько раз вы вызываете функцию rand(). Я отметил это как решение, потому что он работает с текущей функцией std:: rand() каждого компилятора (и это был главный вопрос). Я сравнил свой процессор с тактовой частотой 2,0 ГГц и обнаружил, что я могу вызвать & count rand() 1 000 000 000 раз за 35 секунд. Это может показаться хорошим, но у меня есть 80 000 вызовов для создания одного объекта. Это ограничивает количество поколений до 50 000, поскольку размер unsigned long. Во всяком случае, вот мой код:
class rand2 { unsigned long n; public: rand2 () : n(0) {} unsigned long rnd() { n++; return rand(); } // get number of rand() calls inside this object unsigned long getno () { return n; } // fast forward to a saved position called rec void fast_forward (unsigned long rec) { while (n < rec) rnd(); } };
-
Еще один способ - реализовать свой собственный генератор псевдослучайных чисел, как и предложенный Matteo Italia. Это самое быстрое и возможно лучшее решение. Вы не ограничены вызовами 4 294 967 295 rand() и не должны использовать другие библиотеки. Следует отметить, что разные компиляторы имеют разные генераторы. Я сравнил Matteo LCG с rand() в Mingw/GCC 3.4.2 и g++ 4.3.2. Все три из них были разными (с семенем = 0).
-
Используйте генераторы из С++ 11 или других библиотек, как предположили Cubbi, Jerry Coffin и Mike Seymour. Это лучшая идея, если вы уже работаете с ними. Ссылка для генераторов С++ 11: http://en.cppreference.com/w/cpp/numeric/random (здесь есть некоторые описания алгоритмов)