mt_rand()
Функция mt_rand() в PHP генерирует случайное целое число с помощью алгоритма Вихрь Мерсенна. Узнайте синтаксис, параметры и отличия от rand().
Функция mt_rand() в PHP генерирует случайное целое число с использованием алгоритма Вихрь Мерсенна. На этой странице рассматриваются синтаксис и параметры функции, её отличия от устаревшей rand(), способ задания начального значения для воспроизводимых результатов, а также случаи, когда следует использовать криптографически безопасную альтернативу.
Что делает функция mt_rand()
mt_rand() возвращает псевдослучайное целое число. «Псевдослучайное» означает, что числа получаются с помощью детерминированного алгоритма, инициализированного внутренним состоянием — они выглядят случайными, но одно и то же начальное значение всегда даёт одну и ту же последовательность. Используемый алгоритм Вихрь Мерсенна генерирует числа более высокого качества с более равномерным распределением, чем генератор libc, лежащий в основе устаревшей rand(), и имеет исключительно длинный период (не повторится в течение 2^19937 − 1 значений).
Обратите внимание, что mt_rand() не является криптографически безопасной: если внутреннее состояние известно или может быть восстановлено, будущие значения можно предсказать. Для паролей, токенов, солей или чего-либо, связанного с безопасностью, используйте random_int().
Синтаксис
mt_rand(): int
mt_rand(int $min, int $max): int| Параметр | Описание |
|---|---|
$min | Необязательный. Наименьшее возможное значение результата (включительно). По умолчанию 0. |
$max | Необязательный. Наибольшее возможное значение результата (включительно). По умолчанию mt_getrandmax(). |
Возвращаемое значение: случайное целое число в диапазоне от $min до $max включительно, или от 0 до mt_getrandmax() при вызове без аргументов. Если $min больше $max, PHP выдаёт предупреждение и возвращает false.
Как использовать функцию mt_rand()
Вызовите функцию с двумя аргументами, чтобы получить число из заданного диапазона, или без аргументов — для получения значения в полном диапазоне:
Первый вызов ограничивает результат диапазоном 1–100; второй охватывает полный диапазон, верхнюю границу которого можно узнать с помощью mt_getrandmax() (обычно 2147483647).
Типичные случаи использования
Симуляция броска кубика:
<?php
$roll = mt_rand(1, 6);
echo "You rolled a $roll\n";
?>Выбор случайного элемента массива путём генерации допустимого индекса:
<?php
$colors = ['red', 'green', 'blue', 'yellow'];
$pick = $colors[mt_rand(0, count($colors) - 1)];
echo "Random color: $pick\n";
?>Использование count($colors) - 1 в качестве верхней границы важно: индексы массивов начинаются с нуля, поэтому массив из четырёх элементов имеет допустимые индексы 0–3. (Для этой конкретной задачи array_rand() является более прямым вариантом.)
Инициализация для воспроизводимых результатов
Поскольку алгоритм Вихрь Мерсенна является детерминированным, его инициализация с помощью mt_srand() делает последовательность повторяемой — это полезно для тестов, симуляций или в тех случаях, когда «случайный» вывод должен быть одинаковым при каждом запуске:
<?php
mt_srand(42);
echo mt_rand(), "\n"; // same value every run for seed 42
mt_srand(42); // reset to the same seed
echo mt_rand(), "\n"; // identical to the line above
?>Без явного начального значения PHP автоматически инициализирует генератор, поэтому при каждом запуске вывод будет разным.
Безопасная альтернатива: random_int()
Когда случайность не должна быть предсказуемой — для токенов сессий, кодов сброса пароля, API-ключей — mt_rand() является неподходящим инструментом. Используйте random_int(), которая получает данные из криптографически безопасного источника операционной системы:
<?php
// Cryptographically secure integer between 1 and 100
$secure = random_int(1, 100);
echo $secure, "\n";
?>Функция имеет ту же сигнатуру (int $min, int $max), поэтому замена не составит труда.
mt_rand() против rand()
Начиная с PHP 7.1, rand() является псевдонимом mt_rand() и использует тот же движок Вихрь Мерсенна, поэтому они ведут себя одинаково. В более старых версиях rand() использовала более слабый генератор libc платформы. Предпочитайте mt_rand(), когда вам нужны стабильные результаты высокого качества в разных версиях PHP.
Заключение
mt_rand() — основная функция для быстрого получения псевдослучайных целых чисел хорошего качества в PHP. Используйте её для игр, выборки, перемешивания и общей рандомизации; инициализируйте с помощью mt_srand(), когда нужны воспроизводимые последовательности; и переходите на random_int(), когда важна безопасность.