Я генерирую в своей программе несколько тысяч объектов на основе функции C++ rand(). Хранить их в памяти было бы исчерпывающе. Есть ли способ скопировать ТЕКУЩЕЕ семя rand() в любой момент времени? Это дало бы мне возможность хранить ТОЛЬКО текущие семена, а не полные объекты. (таким образом, я мог регенерировать эти объекты, регенерируя точно такие же подпоследовательности случайных чисел)
Исчерпывающим решением является сохранение полной последовательности случайных чисел, заданной rand()- не стоит Это. Другим было бырешение — реализовать мой собственный класс для рандомизированных чисел.
Google не дал мне никаких подсказок.Существуют сотни статей, обучающих основам rand и srand, и я не смог найти конкретные.
Кто-нибудь знает другие генераторы случайных чисел с реализованным seed-stealer?
Спасибо за быстрые ответы! Есть больше возможных ответов/решений на этот вопрос, поэтому я составил список ваших ответов здесь.
РЕШЕНИЯ:
Краткий ответ: не существует стандартного способа получить начальное число
Ближайший возможный обходной путь — сохранить начальное начальное число в начале и подсчитать, сколько раз вы вызываете функцию rand(). функция. Я отметил это как решение, потому что оно работает с текущей функцией std::rand()каждого компилятора(и это был главный вопрос). Я протестировал свой процессор с частотой 2,0 ГГц и обнаружил, что могу вызывать и считать rand()1 000 000 000 раз за 35 секунд. Это может звучать хорошо, но у меня есть 80 000 вызовов для создания одного объекта. Это ограничивает количество поколений до 50 000 из-за размера unsigned long. Во всяком случае, вот мой код:
class rand2
{
беззнаковое длинное n;
публичный:
ранд2 () : п (0) {}
беззнаковый длинный rnd()
{
п++;
вернуть ранд();
}
// получаем количество вызовов rand() внутри этого объекта
беззнаковое длинное гетно ()
{
вернуть н;
}
// быстрая перемотка вперед к сохраненной позиции с именем rec
void fast_forward (беззнаковая длинная запись)
{
в то время как (n
Другой способ — реализовать собственный генератор псевдослучайных чисел, подобный тому, который предложил Маттео Италия. Это самое быстрое и, возможно, ЛУЧШЕЕ решение.Вы не ограничены 4 294 967 295 вызовами rand(), и вам не нужно использовать другие библиотеки. Стоит отметить, что разные компиляторы имеют разные генераторы. Я сравнил LCGМаттео с rand()в Mingw/GCC 3.4.2 и G++ 4.3.2. Все 3 из них были разными (с seed = 0).
Используйте генераторы из C++11 или других библиотек, как предложили Кубби, Джерри Коффин и Майк Сеймур. Это лучшая идея, если вы уже работаете с ними. Ссылка на генераторы C++11: http://en.cppreference.com/w/cpp/numeric/random (здесь также есть некоторые описания алгоритмов)