rand () с одинаковым посевом дает разные результаты

Я разрабатываю приложение на PHP и C, но результат rand на двух языках различается, хотя я использую одно и то же семя:

PHP:

srand(1);
$random = rand(); // returns 32422

C:

srand(1);
int random = rand(); // returns 41

Почему это происходит?


person Bruno Melo    schedule 28.01.2013    source источник
comment
Поэтому они используют разные генераторы. В этом нет ничего удивительного.   -  person chris    schedule 29.01.2013
comment
Вау! Очаровательный! Генераторы псевдослучайных чисел возвращают разные результаты! (Ничего в документах PHP не говорится, что rand() (PHP) использует rand() (C). Даже в этом случае вы не знаете, используют ли оба одно и то же начальное число).   -  person Zeta    schedule 29.01.2013
comment
поэтому они и называются случайными. Оба могут использовать разные псевдослучайные алгоритмы.   -  person Deepankar Bajpeyi    schedule 29.01.2013
comment
Да, это. Почему вы ожидаете, что они будут такими же? Есть ли где-нибудь в спецификациях PHP, что PHP rand() должен вести себя точно так же, как и C?   -  person    schedule 29.01.2013
comment
кто вам сказал, что они должны генерировать такой же результат?   -  person Vahid Farahmand    schedule 29.01.2013
comment
мое яблоко не похоже на мой апельсин, почему?   -  person    schedule 29.01.2013
comment
Вопрос не такой уж плохой, как кажется на первый взгляд, но все равно довольно плохой. Это все еще сводится к основному ответу, что PHP и C используют разные PRNG. Вы могли бы заставить их возвращать одно и то же, если бы вы заставили их использовать один и тот же ГПСЧ. Один из возможных способов сделать это - использовать общую библиотеку, например OpenSSL.   -  person NullUserException    schedule 29.01.2013
comment
@NullUserException: Уй, это очень плохо !!! Если все сводится к единственному ответу, то это идеальный вопрос для SO (здесь нет двусмысленности) и, следовательно, реальный вопрос. Я только что проголосовал за повторное открытие. Такое случается очень часто. Ответ здесь на SO, безусловно, будет полезен другим людям (так как это происходит часто). Хотя мы должны отредактировать его, чтобы он больше не зависел от языка (чтобы люди могли легко его найти).   -  person Martin York    schedule 29.01.2013
comment
Как и в случае с дополнительными данными, вы также можете получить разные результаты для разных реализаций C.   -  person Daniel Fischer    schedule 29.01.2013


Ответы (1)


Существует несколько способов реализовать генератор псевдослучайных чисел.

Каждый язык программирования может определять свою собственную rand реализацию или даже ничего не указывать. Например, в спецификации C указано только, что «Функция rand вычисляет последовательность псевдослучайных целых чисел в диапазоне от 0 до RAND_MAX». Там нет упоминания о том, как rand должен работать, поэтому авторы компилятора могут реализовать rand, как им нравится.

Многие компиляторы используют линейный конгруэнтный генератор для реализации rand. Даже этот простой алгоритм имеет параметры, которые компилятор может указать и которые изменяют последовательность чисел, заданную конкретным начальным числом.

Параметры LCG

Посмотрите, как Borland и glibc используют разные параметры. Вы даже не можете быть уверены, что rand будет одинаково работать со всеми программами на C, не говоря уже о всех программах в целом!

person Kevin    schedule 29.01.2013