Является ли генератор случайных чисел атомным

Когда функция rand () меняет свое начальное значение?

Возможно ли для второго экземпляра php, вызывающего функцию, прервать и инициировать функцию rand () до того, как первый экземпляр функции изменит начальное значение и тем самым вернет одинаковый результат двум отдельным экземплярам скрипта php?

0

Решение

Каждый экземпляр 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 () может возвращать один и тот же результат.

  1. В вашем вопросе ничего не сказано о проблеме с дублирующимся именем файла, которая вряд ли связана с поведением rand(), Я предлагаю вам прочитать на парадокс дня рождения, что объясняет почему N случайный выбор из набора из 16000 наименований приведет к дублированию выборок с почти 100% достоверностью, как N приближается к 400. Судя по всему, 50 пользователей загружают по 20 файлов каждый, поэтому вероятность того, что нескольким загрузкам будет присвоено одно и то же имя файла, очень близка к 1. Или, другими словами, вероятность того, что нет количество загрузок, присвоенных одному и тому же имени, меньше одного на триллион.

  2. Вы можете проверить атомность 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 миллионов чисел из одного и того же начального числа, а затем выводит последнее число в последовательности. Если эти процессы каким-либо образом мешают друг другу, можно ожидать, что результаты будут нестабильными. Но это не так.

  3. Ответы на этот вопрос объяснить, как генерировать уникальные имена файлов для загруженных файлов.

0

Другие решения

Других решений пока нет …