rand()
Функция rand() в PHP генерирует псевдослучайное целое число. Синтаксис, диапазоны, отличия от mt_rand() и безопасные альтернативы.
Функция rand() в PHP генерирует псевдослучайное целое число. В этой главе рассматриваются её синтаксис, принцип работы необязательных аргументов диапазона, отличие rand() от более быстрой mt_rand(), причины, по которым ни одну из них не следует использовать в целях безопасности, а также несколько практических шаблонов — например, бросок кубика или выбор случайного элемента массива.
Что делает функция rand()
rand() — встроенная функция PHP, возвращающая случайное целое число. Без аргументов она возвращает значение в диапазоне от 0 до getrandmax() (максимального значения, которое может выдать генератор — не менее 32767). Если передать $min и $max, функция вернёт целое число во включающем диапазоне $min ≤ n ≤ $max.
Она генерирует псевдослучайные числа: значения, которые выглядят случайными, но создаются детерминированным алгоритмом на основе внутреннего начального числа (seed). Это подходит для игр, выборки и тестовых данных, но не для случаев, где предсказуемость является риском (см. раздел Безопасность ниже).
Синтаксис
rand(): int
rand(int $min, int $max): int| Параметр | Описание |
|---|---|
$min | Необязательный. Минимальное возвращаемое значение. По умолчанию 0. |
$max | Необязательный. Максимальное возвращаемое значение. По умолчанию getrandmax(). |
$min и $max включены в диапазон, поэтому rand(1, 6) может вернуть 1, 6 или любое значение между ними.
Если $min больше $max, PHP 8 выбрасывает ValueError.
Базовое использование
Здесь мы вызываем rand() с диапазоном, сохраняем результат в $result и выводим его. Запустите пример несколько раз — каждый раз вы получите другое число.
Типичные сценарии использования
Несколько шаблонов, к которым вы будете обращаться чаще всего:
<?php
// 1. Roll a six-sided die
$die = rand(1, 6);
// 2. Pick a random element from an array
$colors = ['red', 'green', 'blue'];
$color = $colors[rand(0, count($colors) - 1)];
// 3. A coin flip
$side = rand(0, 1) === 0 ? 'heads' : 'tails';
echo "Die: $die, Color: $color, Coin: $side";
?>Для выбора элемента массива PHP также предлагает специальный вспомогательный метод
array_rand(), который нагляднее, чем вычислять индекс вручную.
rand() vs mt_rand()
mt_rand() использует алгоритм Вихря Мерсенна. Он работает быстрее и обладает лучшими статистическими свойствами по сравнению с устаревшей rand(), поэтому является предпочтительным выбором для общего использования. Обе функции имеют одинаковую сигнатуру:
<?php
$a = rand(1, 100); // legacy generator
$b = mt_rand(1, 100); // Mersenne Twister — recommended
echo "$a and $b";
?>Начиная с PHP 7.1, rand() фактически является псевдонимом mt_rand() внутри, поэтому они ведут себя одинаково в современных версиях PHP. В новом коде предпочтительнее использовать mt_rand() для ясности. Её аналог
mt_getrandmax() сообщает максимальное значение, которое она может вернуть.
Инициализация генератора
Вы можете инициализировать генератор с помощью srand() (или mt_srand() для mt_rand()). Инициализация фиксированным значением делает последовательность воспроизводимой — удобно для тестов:
<?php
srand(42);
echo rand(1, 100), "\n"; // same output every run for seed 42
?>Начиная с PHP 4.2 вам почти никогда не нужно вызывать srand() вручную — PHP автоматически инициализирует генератор при первом использовании.
Когда не следует использовать rand()
rand() и mt_rand() не являются криптографически стойкими. Их вывод предсказуем, поэтому никогда не используйте их для паролей, токенов, идентификаторов сессий, ссылок для сброса пароля или любых других данных, критичных с точки зрения безопасности. Для этого используйте CSPRNG:
<?php
$secureInt = random_int(1, 100); // cryptographically secure integer
$secureBytes = random_bytes(16); // 16 random bytes
echo $secureInt, ' ', bin2hex($secureBytes);
?>random_int() имеет ту же сигнатуру (min, max), что и rand(), поэтому её обычно можно использовать как прямую замену там, где важна безопасность.
Итоги
rand($min, $max)возвращает псевдослучайное целое число во включающем диапазоне; без аргументов диапазон составляет от0доgetrandmax().- Для общего использования предпочтительнее
mt_rand()— она быстрее и обеспечивает лучшее распределение (аrand()является её псевдонимом начиная с PHP 7.1). - Используйте
random_int()/random_bytes(), когда значение должно быть непредсказуемым.
Подробнее о числовых значениях и математических функциях см. в разделах PHP Numbers и PHP Math.