Getrandmax: примеры (PHP)

Использование getrandmax для генерации случайных чисел
Раздел: Математические функции
getrandmax: int
Что такое getrandmax

Функция getrandmax() возвращает максимально возможное значение, которое может быть сгенерировано функцией rand() без использования аргументов или при вызове rand(0, getrandmax()).

Эта функция не принимает никаких аргументов. Её вызов всегда выглядит как getrandmax().

Когда используется: Функция применяется, когда необходимо узнать верхнюю границу диапазона псевдослучайных чисел, генерируемых стандартным линейным конгруэнтным генератором (ЛКГ) PHP. Это полезно для нормализации значений или создания случайных чисел в определённом пользовательском диапазоне.

Простые примеры использования
Пример 1: Получение максимального значения
echo getrandmax();
2147483647

На большинстве систем это значение равно 2147483647 (2^31 - 1).

Пример 2: Генерация числа от 0 до максимума
$max = getrandmax();
$randomNum = rand(0, $max);
echo "Случайное число между 0 и $max: $randomNum";
Случайное число между 0 и 2147483647: 1328851649
Пример 3: Создание дроби от 0 до 1
$randomFloat = rand() / getrandmax();
echo $randomFloat;
0.7418953164
Похожие функции в PHP

Возвращает максимально возможное значение для генератора Mersenne Twister (mt_rand()). Этот генератор считается быстрее и производит более качественные псевдослучайные числа, чем rand().

echo mt_getrandmax(); // Также обычно 2147483647
random_int()

Криптографически безопасная функция, генерирующая криптографически стойкие псевдослучайные целые числа. Не имеет фиксированного максимума, зависит от переданного диапазона. Предпочтительна для задач, связанных с безопасностью.

echo random_int(0, PHP_INT_MAX);

Что использовать: Для обычных задач (игры, выбор случайного элемента) подойдёт mt_rand()/mt_getrandmax(). Для безопасности (токены, пароли) — random_int(). rand()/getrandmax() сейчас используются реже.

Аналоги в других языках

Getrandmax в Python

Модуль random не предоставляет прямой аналогии. Максимум зависит от функции. random.random() возвращает float в [0.0, 1.0). random.randint(a, b) генерирует целое в заданном диапазоне.

import random
print(random.random())  # Дробь
print(random.randint(0, 100))  # Целое
0.548981235
73

Getrandmax в Javascript

Math.random() возвращает дробь от 0 (включительно) до 1 (исключительно). Нет прямой функции для получения максимума, диапазон определяется умножением.

console.log(Math.random()); // Дробь
console.log(Math.floor(Math.random() * 100)); // Целое от 0 до 99
0.6548321
42

Getrandmax в MySQL

Функция RAND() возвращает дробь. Для целого числа в диапазоне используется формула.

SELECT RAND(); -- Дробь
SELECT FLOOR(RAND() * 100); -- Целое от 0 до 99
0.123456
57

Отличия: В PHP getrandmax() чётко определяет верхний предел для целочисленного генератора. В Python и JS акцент на генерации дроби, а целые числа получают через диапазон.

Типичные ошибки
Ошибка 1: Непонимание диапазона

Ожидание, что rand() вернёт число до getrandmax() включительно, но без параметров rand() возвращает число от 0 до getrandmax().

// Неверная логика
$max = getrandmax();
$random = rand(); // Уже от 0 до $max
// Лишнее действие:
$random = rand(0, $max); // То же самое
Ошибка 2: Путаница с типами данных

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

$max = getrandmax();
$result = $max * 2; // Может превысить PHP_INT_MAX на 64-битных системах?
echo $result;
4294967294

На 64-битной системе это допустимо, но на 32-битной может привести к некорректным результатам.

Ошибка 3: Использование для криптографии

Функции rand() и getrandmax() не подходят для генерации криптографических ключей или паролей.

Изменения в версиях PHP

Начиная с PHP 7.1.0, алгоритм rand() был изменён на тот же, что используется в mt_rand(). Это означает, что последовательность чисел, генерируемая rand(), стала идентичной mt_rand(), и getrandmax() теперь возвращает то же значение, что и mt_getrandmax() (обычно 2147483647).

До PHP 7.1.0 rand() использовал простой линейный конгруэнтный генератор, и его максимальное значение могло быть всего 32768 на некоторых платформах (например, Windows).

В PHP 8.0.0 значительных изменений не было, поведение сохранилось.

Расширенные примеры
Пример 1: Генерация в пользовательском диапазоне

Использование getrandmax() для преобразования в произвольный диапазон.

Пример php
function randomInRange($min, $max) {
    $scale = getrandmax() / ($max - $min);
    return $min + round(rand() / $scale);
}
echo randomInRange(5, 15);
11
Пример 2: Симуляция вероятности

Моделирование события с заданной вероятностью.

Пример php
$probability = 0.3; // 30%
$threshold = $probability * getrandmax();
$outcome = rand() < $threshold ? 'Событие произошло' : 'Событие не произошло';
echo $outcome;
Событие произошло
Пример 3: Создание случайного пароля из заданного набора
Пример php
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$password = '';
$maxIndex = strlen($chars) - 1;
for ($i = 0; $i < 10; $i++) {
    // Генерация индекса от 0 до $maxIndex
    $index = (int) (rand() / getrandmax() * $maxIndex);
    $password .= $chars[$index];
}
echo $password;
a7f3b9k1p2
Пример 4: Сравнение распределения

Проверка равномерности распределения (упрощённо).

Пример php
$buckets = array_fill(0, 10, 0); // 10 корзин
$iterations = 10000;
for ($i = 0; $i < $iterations; $i++) {
    $value = rand() / getrandmax(); // Дробь от 0 до 1
    $bucket = (int) ($value * 10); // Определяем корзину (0-9)
    $buckets[$bucket]++;
}
print_r($buckets);
Array
(
    [0] => 1012
    [1] => 987
    [2] => 1003
    [3] => 1005
    [4] => 1008
    [5] => 1001
    [6] => 995
    [7] => 1015
    [8] => 987
    [9] => 987
)
Пример 5: Симуляция броска кубика
Пример php
function rollDice($sides = 6) {
    // Генерируем число от 1 до $sides
    return 1 + (int) (rand() / getrandmax() * $sides);
}
echo 'Выпало: ' . rollDice();
Выпало: 4

PHP getrandmax function comments

En
Getrandmax Show largest possible random value