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