Какое определение предвзятости в:
Распределение возвращаемых значений 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.