Intereting Posts
PHP 5.3, по-видимому, отсутствует Intl-расширение по умолчанию PHP Looping Template Engine – от царапин Личная переменная Laravel, разделенная между двумя методами в контроллере PHP-скрипт порождает запросы к бесконечному циклу PHP читается из загруженного текстового файла? Процесс виртуализации PHP – получение родительского вывода в родительском Страница невыполнения LARAVEL не загружается – Ошибка 324 – ERR_EMPTY_RESPONSE Регулярное выражение PHP для соответствия строкам, начинающимся со специального символа JavaScript для обновления MySQL? Проблема с AJAX, загружающая скрипт php, вызываемый из onclick; Как преобразовать текст с помощью HTML-адресов и недопустимых символов в эквивалент UTF-8? PHP MongoDB Исключить _id из результатов Создание субдомена при регистрации пользователя PHP – определение пробелов между строками Как связать имена пользователей Twitter с помощью PHP preg_replace?

Каков недостаток mt_rand?

Какое определение предвзятости в:

Распределение возвращаемых значений mt_rand () смещается к четным числам в 64-битных сборках PHP, когда max превышает 2 ^ 32.

Если это предвзятость, указанная в альтернативных правилах развязывания для округления , я не думаю, что это действительно имеет значение (поскольку смещение на самом деле не видно).

Кроме того, mt_rand() считается в четыре раза быстрее, чем rand() , просто добавив три символа спереди!

Предполагая, что mt_rand доступен, каков недостаток его использования?

mt_rand использует алгоритм Mersenne Twister , который намного лучше, чем LCG, обычно используемый rand . Например, период LCG является незначительным 2 32 , тогда как период mt_rand равен 2 19937 – 1. Кроме того, все значения, генерируемые LCG, будут лежать на линиях или плоскостях при построении в многомерном пространстве. Кроме того, это не только практически осуществимо, но относительно легко определить параметры LCG. Единственное преимущество LCG в том, что потенциально несколько быстрее, но по шкале, которая совершенно не имеет значения при кодировании в php.

Однако mt_rand не подходит для криптографических целей (генерация токенов, паролей или криптографических ключей).

Если вам нужна криптографическая случайность, используйте random_int в php 7. В более старых версиях PHP читайте /dev/urandom или /dev/random в соответствующей операционной системе POSIX.

Распределение, которое вы цитируете, имеет значение только тогда, когда диапазон случайных чисел, который вы создаете, больше 2 ^ 32. Это 4294967296.

Если вы работаете с большими числами, и вам нужно, чтобы они были рандомизированы, возможно, это повод пересмотреть использование mt_rand() . Однако, если вы работаете с числами меньше этого, тогда это не имеет значения.

Причина, по которой это происходит, связана с тем, что генератор случайных чисел не достаточно хорош в этих высоких диапазонах.

Я никогда не работал со случайными числами, большими, поэтому мне никогда не приходилось беспокоиться об этом.

Разница между rand() и mt_rand() намного больше, чем «всего три дополнительных символа». Это совершенно разные вызовы функций и работают совершенно по-разному. Точно так же, как вы не ожидаете, что print() и print_r() будут похожи.

mt_rand() получает свое имя от алгоритма «Mersene Twister», который он использует для генерации случайных чисел. Известно, что этот алгоритм является быстрым, эффективным и высококачественным генератором случайных чисел, поэтому он доступен на PHP.

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

Поэтому для практически всех применений mt_rand() является лучшей функцией для использования, чем rand() .

Вы говорите: «Предполагая, что mt_rand() доступен», но это всегда будет, так как оно было введено обратно в PHP4.