Я понимаю, что функция rand()
генерирует псевдослучайные числа на основе заданного семени и что на данной платформе она всегда будет генерировать одну и ту же последовательность чисел из одного и того же семени, что я хочу знать почему он дает другую последовательность на платформах, которые используют одну и ту же библиотеку? То есть как реализовано rand()
?
Почему функция С++ stdlib rand() дает разные значения для одного и того же семестра на разных платформах?
Ответ 1
В стандарте С++ не указывается, какой алгоритм используется для функции rand().
Функциональность определяется тем, кто написал стандартную библиотеку в вашей системе: Microsoft для стандартной библиотеки, входящей в состав Visual Studio, и ребята из GNU для стандартной библиотеки, упакованной с GCC.
Ваш компилятор делает выбор, откуда он получает свою библиотеку, поэтому у вас могут быть разные версии стандартной библиотеки для разных компиляторов в одной и той же системе. Пункт остается тем же: спецификация гарантирует, какие функции доступны и что они делают; а не как они это делают.
Ответ 2
Функция rand() должна вычислять последовательность псевдослучайных целых чисел в диапазоне [0, {RAND_MAX}] с периодом не менее 2 ^ 32.
Функция rand_r() должна вычислять последовательность псевдослучайных целые числа в диапазоне [0, {RAND_MAX}]. (Значение {RAND_MAX} макрос должен быть не менее 32767.)
Если rand_r() вызывается с тем же начальным значением для объекта указываемый семенем, и этот объект не изменяется между последовательными возвращает и вызывает rand_r(), должна генерироваться одна и та же последовательность.
Функция srand() использует этот аргумент как семя для новой последовательности псевдослучайные числа, возвращаемые последующими вызовами rand(). Если Затем srand() вызывается с тем же начальным значением, последовательность псевдослучайные числа повторяются. Если rand() вызывается до любые вызовы srand() сделаны, одна и та же последовательность должна быть сгенерирована как когда srand() сначала вызывается с начальным значением 1.
Функция rand() возвращает следующее псевдослучайное число в Последовательность.
Это то, о чем говорит стандарт IEEE Std 1003.1 C о том, как должна себя вести функция rand()
. Он ничего не говорит о том, как должна рассчитываться последовательность. Другими словами, каждый разработчик может свободно выбирать свою собственную версию генератора псевдослучайных последовательностей.
Ваши наблюдения показывают, что они воспользовались этой свободой.
Я также могу указать, что rand()
является частью <cstdlib>
, которая является более или менее копией стандартной библиотеки C, и новая библиотека предоставит вам больше гибкости и генераторов стандартной последовательности, если у вас есть достаточно новый С++-компилятор и не зависит от совместимости C-С++.