Getrandmax: примеры (PHP)
getrandmax: intФункция getrandmax() возвращает максимально возможное значение, которое может быть сгенерировано функцией rand() без использования аргументов или при вызове rand(0, getrandmax()).
Эта функция не принимает никаких аргументов. Её вызов всегда выглядит как getrandmax().
Когда используется: Функция применяется, когда необходимо узнать верхнюю границу диапазона псевдослучайных чисел, генерируемых стандартным линейным конгруэнтным генератором (ЛКГ) PHP. Это полезно для нормализации значений или создания случайных чисел в определённом пользовательском диапазоне.
echo getrandmax();2147483647
На большинстве систем это значение равно 2147483647 (2^31 - 1).
$max = getrandmax();
$randomNum = rand(0, $max);
echo "Случайное число между 0 и $max: $randomNum";Случайное число между 0 и 2147483647: 1328851649
$randomFloat = rand() / getrandmax();
echo $randomFloat;0.7418953164
Возвращает максимально возможное значение для генератора Mersenne Twister (mt_rand()). Этот генератор считается быстрее и производит более качественные псевдослучайные числа, чем rand().
echo mt_getrandmax(); // Также обычно 2147483647Криптографически безопасная функция, генерирующая криптографически стойкие псевдослучайные целые числа. Не имеет фиксированного максимума, зависит от переданного диапазона. Предпочтительна для задач, связанных с безопасностью.
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 до 990.6548321 42
Getrandmax в MySQL
Функция RAND() возвращает дробь. Для целого числа в диапазоне используется формула.
SELECT RAND(); -- Дробь
SELECT FLOOR(RAND() * 100); -- Целое от 0 до 990.123456 57
Отличия: В PHP getrandmax() чётко определяет верхний предел для целочисленного генератора. В Python и JS акцент на генерации дроби, а целые числа получают через диапазон.
Ожидание, что rand() вернёт число до getrandmax() включительно, но без параметров rand() возвращает число от 0 до getrandmax().
// Неверная логика
$max = getrandmax();
$random = rand(); // Уже от 0 до $max
// Лишнее действие:
$random = rand(0, $max); // То же самоеПопытка использовать значение для точных математических операций без учёта возможного переполнения.
$max = getrandmax();
$result = $max * 2; // Может превысить PHP_INT_MAX на 64-битных системах?
echo $result;4294967294
На 64-битной системе это допустимо, но на 32-битной может привести к некорректным результатам.
Функции rand() и getrandmax() не подходят для генерации криптографических ключей или паролей.
Начиная с 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 значительных изменений не было, поведение сохранилось.
Использование getrandmax() для преобразования в произвольный диапазон.
function randomInRange($min, $max) {
$scale = getrandmax() / ($max - $min);
return $min + round(rand() / $scale);
}
echo randomInRange(5, 15);11
Моделирование события с заданной вероятностью.
$probability = 0.3; // 30%
$threshold = $probability * getrandmax();
$outcome = rand() < $threshold ? 'Событие произошло' : 'Событие не произошло';
echo $outcome;Событие произошло
$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
Проверка равномерности распределения (упрощённо).
$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
)function rollDice($sides = 6) {
// Генерируем число от 1 до $sides
return 1 + (int) (rand() / getrandmax() * $sides);
}
echo 'Выпало: ' . rollDice();Выпало: 4