Как получить текущее начальное число из C++ rand()?

Я генерирую в своей программе несколько тысяч объектов на основе функции C++ rand(). Хранить их в памяти было бы исчерпывающе. Есть ли способ скопировать ТЕКУЩЕЕ семя rand() в любой момент времени? Это дало бы мне возможность хранить ТОЛЬКО текущие семена, а не полные объекты. (таким образом, я мог регенерировать эти объекты, регенерируя точно такие же подпоследовательности случайных чисел)

Исчерпывающим решением является сохранение полной последовательности случайных чисел, заданной rand()- не стоит Это. Другим было бырешение — реализовать мой собственный класс для рандомизированных чисел.

Google не дал мне никаких подсказок.Существуют сотни статей, обучающих основам rand и srand, и я не смог найти конкретные.

Кто-нибудь знает другие генераторы случайных чисел с реализованным seed-stealer?


Спасибо за быстрые ответы! Есть больше возможных ответов/решений на этот вопрос, поэтому я составил список ваших ответов здесь.

РЕШЕНИЯ:

  1. Краткий ответ: не существует стандартного способа получить начальное число

  2. Ближайший возможный обходной путь — сохранить начальное начальное число в начале и подсчитать, сколько раз вы вызываете функцию 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 
  3. Другой способ — реализовать собственный генератор псевдослучайных чисел, подобный тому, который предложил Маттео Италия. Это самое быстрое и, возможно, ЛУЧШЕЕ решение.Вы не ограничены 4 294 967 295 вызовами rand(), и вам не нужно использовать другие библиотеки. Стоит отметить, что разные компиляторы имеют разные генераторы. Я сравнил LCGМаттео с rand()в Mingw/GCC 3.4.2 и G++ 4.3.2. Все 3 из них были разными (с seed = 0).

  4. Используйте генераторы из C++11 или других библиотек, как предложили Кубби, Джерри Коффин и Майк Сеймур. Это лучшая идея, если вы уже работаете с ними. Ссылка на генераторы C++11: http://en.cppreference.com/w/cpp/numeric/random (здесь также есть некоторые описания алгоритмов)

19
задан Bill the Lizard 14 February 2013 в 13:36
поделиться