Подтвердить что ты не робот

Почему функция С++ stdlib rand() дает разные значения для одного и того же семестра на разных платформах?

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

4b9b3361

Ответ 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-С++.