W3docs

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() просто — вызовите её без аргументов. Вот базовый пример:

Базовое использование

php— editable, runs on the server

Приведённый код получает верхнюю границу и сохраняет её в переменной для дальнейшего использования.

Задание явного диапазона Можно комбинировать 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() для инициализации генератора.

Практика

Практика
Что делает функция PHP mt_getrandmax()?
Что делает функция PHP mt_getrandmax()?
Was this page helpful?