Srand семян согласованность между физическими машинами - PullRequest
3 голосов
/ 09 марта 2011

Я не совсем уверен, как сформулировать этот вопрос, но я не смог найти других, подобных этому.

Скажите, что у меня есть этот код:

srand(1);
srand(SOME_DEFINED_CONST_INT);

Если я запускаюэтот исполняемый файл на нескольких разных физических машинах, последовательность rand() гарантированно согласована между ними?т.е. если я получу 1, 4, 6, 3, 4 на одной машине, всегда ли я получу ту же самую последовательность на других?

Если да , как это можно доказать?Является ли это частью стандарта?

Если нет , могу ли я что-нибудь сделать для этого?

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

Как сказал Армен, это нестандартно.Однако если вы посмотрите на страницу руководства для srand() в Linux, вы увидите кое-что интересное:

POSIX 1003.1-2003 дает следующий пример реализации 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;
       }
3 голосов
/ 09 марта 2011

Нет, стандарт не гарантирует такой вещи. Однако логика генерации случайных чисел находится внутри стандартной библиотеки C. Поэтому, если вы создаете приложение с той же версией библиотеки, последовательность должна быть одинаковой. Вторая часть моего ответа - лишь предположение, но стандарт определенно не дает никаких гарантий.

1 голос
/ 09 марта 2011

Я добавлю, что если вы работаете под Windows, если вы берете свой exe и перемещаетесь между компьютерами, srand БУДЕТ генерировать те же числа, потому что реализация srand зависит от разработчика, но вы всегда будете использовать время выполнения того же разработчика (поэтому, если вы используете Microsoft C ++, вы будете использовать srand от Microsoft, и MS, вероятно, не изменит свою реализацию srand сегодня или завтра). То же самое для Linux. Ваш srand всегда будет одним из glibc. Если они не изменят его в glibc, числа будут одинаковыми.

1 голос
/ 09 марта 2011

Как сказал Мэт, всегда полезно реализовать генератор случайных чисел самостоятельно. Желательно в объектно-ориентированной манере. В качестве приятного побочного эффекта вы можете получить безопасность потоков и, возможно, скорость помимо согласованности на разных платформах. Линейные конгруэнтные генераторы http://en.wikipedia.org/wiki/Linear_congruential_generator или мерсенновый твистер http://en.wikipedia.org/wiki/Mersenne_twister унесут вас далеко.

...