Mt rand: примеры (PHP)

mt_rand в PHP: руководство с примерами кода
Раздел: Математические функции
mt_rand(int $min = 0, int $max = ?): int

Функция mt_rand() генерирует псевдослучайное целое число с использованием алгоритма Mersenne Twister. Этот алгоритм известен высокой скоростью работы и хорошим распределением случайных чисел. Функция применяется в задачах, где не требуется криптографическая стойкость, например, для генерации тестовых данных, случайных выборок, симуляций или игровых механик.

Аргументы функции
  • $min (необязательный) - минимальное значение диапазона (включительно). По умолчанию равен 0.
  • $max (необязательный) - максимальное значение диапазона (включительно). Если указан только $max, то диапазон считается от 0 до $max. Если оба параметра опущены, функция возвращает число от 0 до mt_getrandmax().

До PHP 7.1 функция имела проблемы с равномерностью распределения при указании диапазона. Начиная с PHP 7.1, этот недостаток устранён.

Основные примеры использования

Пример с одним параметром (максимум):

echo mt_rand(10);
7

Пример с указанием диапазона:

echo mt_rand(5, 15);
12

Пример без параметров:

echo mt_rand();
1481767873

Генерация случайного булева значения:

$bool = (mt_rand(0, 1) === 1);
var_dump($bool);
bool(true)
Похожие функции в PHP
  • rand() - более старая функция, которая в современных версиях PHP является псевдонимом для mt_rand(). Использование mt_rand() предпочтительнее из-за лучшей производительности и качества генерации.
  • random_int($min, $max) - функция, которая генерирует криптографически безопасные псевсевдослучайные целые числа. Её применение необходимо в задачах, связанных с безопасностью (токены, пароли, ключи). Работает медленнее, чем mt_rand().
  • openssl_random_pseudo_bytes($length) - генерирует криптографически безопасные псевдослучайные байты. Используется для создания криптографических ключей и токенов.

Для большинства некритичных к безопасности задач подходит mt_rand().

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

Mt rand в Python

Модуль random предоставляет функцию randint(a, b).

import random
print(random.randint(1, 10))
6

Mt rand в Javascript

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

// Генерация числа от 1 до 10 включительно
let num = Math.floor(Math.random() * 10) + 1;
console.log(num);
4

Mt rand в MySQL

Функция RAND() возвращает случайное число с плавающей точкой от 0 до 1. Для целых чисел используют вычисления.

-- Генерация целого числа от 5 до 15
SELECT FLOOR(RAND() * (15 - 5 + 1)) + 5;
9
Типичные ошибки

1. Перепутанный порядок аргументов (сначала должен идти минимум, затем максимум).

// Ошибка: минимум больше максимума
$num = mt_rand(20, 10);
echo $num;
// Начиная с PHP 7.1, функция корректно меняет аргументы местами.
// Результат будет от 10 до 20.
15

2. Использование для криптографических задач, где требуется безопасность.

// Небезопасно для генерации токена!
$token = mt_rand();

3. Ожидание включения верхней границы. В mt_rand($min, $max) оба значения включены в диапазон, что иногда приводит к путанице с другими языками, где верхняя граница исключена.

// Диапазон включает и 0, и 10.
$num = mt_rand(0, 10);
Изменения в версиях PHP
  • PHP 7.1: Функция mt_rand() была обновлена для использования корректной версии алгоритма Mersenne Twister. Исправлена ошибка равномерности распределения. Теперь, если $min > $max, аргументы автоматически меняются местами.
  • PHP 8.2: Функция rand() и mt_rand() теперь возвращают значение в полном диапазоне 64-битных чисел на 64-битных системах. mt_getrandmax() возвращает 2^31-1 на 32-битных системах и 2^63-1 на 64-битных.
Расширенные примеры

Генерация случайной строки заданной длины:

Пример php
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[mt_rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
echo generateRandomString(8);
a7f92gdh

Случайная выборка элемента из массива:

Пример php
$items = ['яблоко', 'банан', 'апельсин', 'виноград'];
$randomItem = $items[mt_rand(0, count($items) - 1)];
echo $randomItem;
банан

Имитация броска двух игральных костей:

Пример php
$dice1 = mt_rand(1, 6);
$dice2 = mt_rand(1, 6);
echo "Выпало: $dice1 и $dice2. Сумма: " . ($dice1 + $dice2);
Выпало: 4 и 6. Сумма: 10

Генерация случайного пароля с использованием различных наборов символов:

Пример php
function generatePassword($length) {
    $sets = [];
    $sets[] = 'abcdefghjkmnpqrstuvwxyz';
    $sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
    $sets[] = '23456789';
    $sets[] = '!@#$%&*?';
    $password = '';
    // Гарантированно взять по одному символу из каждого набора
    foreach ($sets as $set) {
        $password .= $set[mt_rand(0, strlen($set) - 1)];
    }
    // Добить длину символами из всех наборов
    $all = implode('', $sets);
    for ($i = strlen($password); $i < $length; $i++) {
        $password .= $all[mt_rand(0, strlen($all) - 1)];
    }
    // Перемешать символы
    return str_shuffle($password);
}
echo generatePassword(12);
T7s?b&3Kq9#A

Создание тестовых данных с плавающими числами в диапазоне:

Пример php
function randomFloat($min, $max) {
    return $min + mt_rand() / mt_getrandmax() * ($max - $min);
}
echo randomFloat(1.5, 5.5);
3.876542189

PHP mt_rand function comments

En
Mt rand Generate a random value via the Mersenne Twister Random Number Generator