Является ли rand () зависящим от времени в php?

Позвольте нам объяснить, что я имею в виду.

Некоторое время назад, написав программу в c #, я допустил следующую ошибку:

int Randomize() { Random r=new Random(); return r.Next(0,10); } 

в c # это ошибка, потому что, вызываемая несколько раз подряд, эта функция возвращает одно и то же значение. Это связано с тем, что Random constructor использует временное семя, а разница во времени между вызовами была слишком низкой (мне понадобился час, чтобы найти этот 🙂 :).

Теперь я использую rand(...) в php, и мне нужно, чтобы результат всегда отличался, даже если 2 скрипта выполняются одновременно.

Должен ли я что-то делать, чтобы получить этот результат, или он предназначен для работы таким образом?

rand() а также mt_rand() вызывает srand() и mt_srand() для получения всегда случайных результатов. Но вот интересный пост на php.net:

Обратите внимание, что автоматическое сеяние, по-видимому, выполняется с текущим количеством секунд, что означает, что вы можете получить одинаковые результаты для нескольких прогонов на быстром сервере. Либо вызовите srand () самостоятельно с более часто меняющимся семенем, либо используйте mt_rand (), который, как представляется, не страдает от проблемы.

Итак, просто позвоните srand чаще или mt_rand .

О функции mt_rand()

С http://php.net/manual/en/function.mt-srand.php

Начиная с PHP 4.2.0, нет необходимости засевать генератор случайных чисел с помощью srand () или mt_srand (), поскольку это выполняется автоматически.

(Для PHP 5.2.1) Реализация Mersenne Twister в PHP теперь использует новый алгоритм посева Ричарда Вагнера. Идентичные семена больше не производят одну и ту же последовательность значений, которые они делали в предыдущих версиях. Такое поведение, как ожидается, не изменится снова, но считается небезопасным полагаться на него, тем не менее.

Вот ссылка , с описанием алгоритма генерации псевдослучайных чисел « Mersenne Twister (MT) » (и реализации в C, C ++, C #),

Здесь вы можете найти реализацию этой функции в PHP 5

И в php_rand.h я нашел это:

 #ifdef PHP_WIN32 #define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) #else #define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) #endif 

Итак, теперь вы можете видеть, что случайные функции в PHP полагаются на функцию time