Является ли генератор случайных чисел атомным - PullRequest
0 голосов
/ 04 июня 2018

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

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

1 Ответ

0 голосов
/ 04 июня 2018

Каждый экземпляр 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. Ответы на на этот вопрос объясняют, как генерировать уникальные имена файлов для загружаемых файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...