Как устранить все источники случайности, чтобы программа всегда давала одинаковые ответы?
У меня есть код 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() и используйте один из генераторов случайных чисел оттуда, что обеспечивает повторяемость независимо от того, на какой платформе вы работаете.