Подтвердить что ты не робот

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

Какое определение смещения в:

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

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

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

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

4b9b3361

Ответ 1

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

Распределение, которое вы цитируете, имеет значение только в том случае, когда диапазон случайных чисел, который вы создаете, больше 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.