Как устранить все источники случайности, чтобы программа всегда давала одинаковые ответы?

У меня есть код C++, который сильно зависит от выборки (с использованием rand()), но я хочу, чтобы он был воспроизводимым. Поэтому вначале я инициализирую srand() случайным начальным числом и распечатываю его. Я хочу, чтобы другие могли снова запустить тот же код, но инициализировать srand() с тем же начальным числом и получить точно такой же ответ, как и я.

Но при каких обстоятельствах это гарантировано? Я полагаю, что работает, только если двоичные файлы скомпилированы с тем же компилятором в той же системе? Какие еще факторы могут сделать ответ отличным от того, который я получил изначально?

4 ответа

Решение

Решение состоит в том, чтобы использовать один и тот же код во всех случаях - библиотека случайных чисел Boost бесконечно лучше любой стандартной реализации библиотеки C++, и вы можете использовать один и тот же код на всех платформах. Посмотрите на этот вопрос на примере его использования и ссылки на документы библиотеки.

Вы правы, что последовательности могут отличаться, если скомпилированы на разных машинах с разными rand Реализации. Лучший способ обойти это - написать свой PRNG. Справочная страница по Linux для srand приводит следующий простой пример (процитированный из стандарта POSIX):

В POSIX.1-2001 приведен следующий пример реализации rand() и srand(), возможно, полезный, когда требуется одна и та же последовательность на двух разных машинах.

 static unsigned long next = 1;

 /* RAND_MAX assumed to be 32767 */
 int myrand(void) {
     next = next * 1103515245 + 12345;
     return((unsigned)(next/65536) % 32768);
 }

 void mysrand(unsigned seed) {
     next = seed;
 }

Чтобы избежать такого рода проблем, напишите свою собственную реализацию rand()! Я не эксперт по алгоритмам генерации случайных чисел, поэтому скажу не более того...

Проверьте реализацию rand() и используйте один из генераторов случайных чисел оттуда, что обеспечивает повторяемость независимо от того, на какой платформе вы работаете.

Другие вопросы по тегам