Когда функция rand () меняет свое начальное значение?
Возможно ли для второго экземпляра php, вызывающего функцию, прервать и инициировать функцию rand () до того, как первый экземпляр функции изменит начальное значение и тем самым вернет одинаковый результат двум отдельным экземплярам скрипта php?
Каждый экземпляр 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 миллионов чисел из одного и того же начального числа, а затем выводит последнее число в последовательности. Если эти процессы каким-либо образом мешают друг другу, можно ожидать, что результаты будут нестабильными. Но это не так.
Ответы на этот вопрос объяснить, как генерировать уникальные имена файлов для загруженных файлов.
Других решений пока нет …