mt_getrandmax()
Разбираем функцию mt_getrandmax() в PHP: что она возвращает, синтаксис и отличия от getrandmax().
Функция mt_getrandmax() в PHP возвращает наибольшее целое число, которое может сгенерировать mt_rand(). Она не принимает аргументов и возвращает постоянное значение на протяжении всего выполнения скрипта, поэтому её в основном используют как известную верхнюю границу при масштабировании или нормализации случайных чисел.
На этой странице рассматривается, что возвращает функция, её синтаксис, почему это значение важно, как получить случайное число с плавающей точкой, типичные ошибки и отличия от устаревшей getrandmax().
Что такое функция mt_getrandmax()?
mt_getrandmax() — встроенная функция PHP, которая возвращает int — наибольшее значение, которое может выдать mt_rand(). Поскольку mt_rand() использует генератор псевдослучайных чисел Mersenne Twister, эта функция раскрывает верхнюю границу диапазона его вывода.
Значение зависит от платформы, но на всех современных сборках PHP оно равно 2147483647 (2^31 - 1). На 64-битных системах оно не увеличивается — mt_rand() всегда работает в 32-битном диапазоне, поэтому mt_getrandmax() везде возвращает одно и то же число. Считайте его константой на время выполнения скрипта.
Синтаксис
mt_getrandmax(): int- Параметры: отсутствуют.
- Возвращаемое значение: максимальное целое число, которое может вернуть
mt_rand().
Как использовать функцию mt_getrandmax()
Использовать mt_getrandmax() просто — вызовите её без аргументов. Вот базовый пример:
Базовое использование
Приведённый код получает верхнюю границу и сохраняет её в переменной для дальнейшего использования.
Задание явного диапазона
Можно комбинировать mt_getrandmax() с mt_rand(), чтобы явно указать полный диапазон вывода. Два вызова ниже эквивалентны — вызов mt_rand() без аргументов уже возвращает значение в диапазоне от 0 до mt_getrandmax():
<?php
$max = mt_getrandmax();
$randomNumber = mt_rand(0, $max);
echo $randomNumber, "\n"; // some value in 0..2147483647
echo mt_rand(), "\n"; // identical range, no arguments needed
?>Генерация случайного числа с плавающей точкой от 0 до 1
Наиболее распространённое применение mt_getrandmax() — нормализация случайного целого числа в вещественное из диапазона [0, 1). Разделите случайное целое число на максимум:
<?php
$ratio = mt_rand() / (mt_getrandmax() + 1);
echo $ratio; // e.g. 0.4173...
?>Прибавление 1 к делителю гарантирует, что результат строго меньше 1. Чтобы масштабировать в произвольный диапазон [$min, $max], умножьте соотношение на ширину диапазона:
<?php
$min = 5;
$max = 25;
$value = $min + $ratio * ($max - $min);Типичные ошибки
- Это не устанавливатель.
mt_getrandmax()только читает верхнюю границу — изменить её невозможно. Чтобы ограничить вывод, передавайтеminиmaxвmt_rand(). - Функция не принимает аргументов. Передача любых аргументов вызовет
ArgumentCountErrorв PHP 8+. - Не является криптографически стойкой. Ни
mt_rand(), ни её диапазон не подходят для паролей, токенов или ключей. Для криптографически безопасной случайности используйтеrandom_int()илиrandom_bytes(). - Избегайте трюка с остатком от деления для диапазонов.
mt_rand() % $nвносит смещение в сторону меньших значений. Предпочтительнееmt_rand(0, $n - 1).
mt_getrandmax() vs getrandmax()
PHP поставляется с двумя параллельными генераторами. getrandmax() сообщает лимит для устаревшей функции rand(), тогда как mt_getrandmax() — лимит для mt_rand(). Начиная с PHP 7.1, rand() и mt_rand() используют один и тот же движок Mersenne Twister внутри, поэтому обе функции возвращают 2147483647 — но для ясности всё равно следует сопоставлять каждую *getrandmax() с соответствующим генератором.
Заключение
mt_getrandmax() возвращает верхнюю границу генератора Mersenne Twister в PHP (2147483647 в современных сборках). Её основная ценность — использование в качестве делителя для получения нормализованных случайных чисел с плавающей точкой и масштабированных диапазонов. Для криптографически стойкой случайности используйте random_int(), и помните, что функция доступна только для чтения — применяйте mt_rand($min, $max) для реального ограничения результатов. См. также mt_srand() для инициализации генератора.