Позвольте нам объяснить, что я имею в виду.
Некоторое время назад, написав программу в 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
…