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

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

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

Ответы [ 4 ]

8 голосов
/ 08 августа 2010

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

3 голосов
/ 08 августа 2010

Вы правы, что последовательности могут отличаться, если скомпилированы на разных машинах с разными реализациями 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;
 }
0 голосов
/ 08 августа 2010

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

0 голосов
/ 08 августа 2010

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

...