Каждый экземпляр PHP будет иметь свое собственное начальное значение.Вы можете изменить начальное значение в любое время, вызвав srand()
.
Случайная последовательность для определенного начального значения может измениться с одной версии PHP на другую (особенно в версии 4.2.0 при автоматическом заполнении rand()
была введена, и версия 7.1.0, когда rand()
был сделан псевдоним mt_rand()
).
Однако, пока вы работаете с той же версией PHP, последовательность чиселвозвращаемые последовательными вызовами rand()
после вызова srand()
с определенным значением всегда будут точно такими же.
Обновление на основе вашего комментария
Но если у вас есть асинхронная загрузка 20 файлов изображений, на которых запущен один и тот же сценарий php, и в этом сценарии есть функция rand (), которая используется для возврата случайного числа, которое используется для выбора имени файла из 16 тысяч возможных.Имена и в пределах 50 пользователей 8 или 10 создают одинаковые имена файлов. Я склоняюсь к выводу, что rand () не только не атомарен, но возможен для разных инстаВ PHP необходимо, чтобы rand () возвращал тот же результат.
В вашем вопросе не упоминалась проблема с дублирующимся именем файла, которая вряд ли связана с поведениемrand()
.Я предлагаю вам прочитать парадокс дня рождения , который объясняет, почему n случайных выборок из набора из 16000 наименований приведет к дублированию выборок с почти 100% достоверностью как n приближается к 400. Судя по всему, 50 пользователей загружают по 20 файлов каждый, поэтому вероятность того, что нескольким загрузкам будет присвоено одно и то же имя файла, очень близка к 1. Или, другими словами, вероятность наличия нет количество загрузок, назначенных одному и тому же имени файла, меньше одного на триллион.
Вы можете проверить атомарность rand()
для себя.Скопируйте в свою командную строку следующее:
for n in $(seq 1 20)
do
sleep 0.05
php -r "srand(0); for (\$i=0; \$i<20000000; \$i++) rand(); echo '$n: ' . rand() . chr(10);" &
done
Это создает 20 одновременных процессов, каждый из которых генерирует 20 миллионов чисел из одного и того же начального числа, а затем выводит последнее число в последовательности.Если эти процессы каким-либо образом мешают друг другу, можно ожидать, что результаты будут нестабильными.Но это не так.
Ответы на на этот вопрос объясняют, как генерировать уникальные имена файлов для загружаемых файлов.