PHP 8.4.1 Released!

mt_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_randГенерирует случайное значение через генератор случайных чисел на базе Вихря Мерсенна

Описание

mt_rand(): int
mt_rand(int $min, int $max): int

В генераторах случайных чисел старых стандартных библиотек языка С (libc) сомнительные или неизвестные характеристики и эти генераторы работают медленно. Функция mt_rand() заменяет старую функцию rand(). Она использует генератор случайных чисел с известными характеристиками, который основан » на Вихре Мерсенна и генерирует случайные числа в среднем в четыре раза быстрее, чем функция rand() стандартной библиотеки языка C.

При вызове без необязательных параметров min и max функция mt_rand() возвращает псевдослучайное значение от 0 до значения, которое возвращает функция mt_getrandmax(). Когда требуется случайное число между, например, 5 и 15 (включительно), вызывают mt_rand(5, 15)

Предостережение

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

Безопасные для криптографических целей случайные последовательности создаёт композиция класса Random\Randomizer с движком Random\Engine\Secure. В простых сценариях пользуются функциями random_int() и random_bytes() с удобным и безопасным API-интерфейсом, который поддерживается безопасным для криптографических целей CSPRNG-генератором псевдослучайных чисел операционной системы.

Список параметров

min

Необязательный параметр: минимальное значение случайного числа (по умолчанию: 0)

max

Необязательный параметр: максимальное значение случайного числа (по умолчанию: значение, которое возвращает функция mt_getrandmax())

Возвращаемые значения

Функция возвращает случайное целое значение между значением параметра min (или 0) и значением параметра max (или значением, которое возвращает функция mt_getrandmax(), включительно), или false, если параметр max меньше параметра min.

Список изменений

Версия Описание
7.2.0 В функции mt_rand() исправили ошибку смещения по модулю. То есть последовательности, которые сгенерировали с конкретным начальным значением, могут несовпадать со значениями, которые сгенерировали в PHP 7.1 на 64-битных машинах.
7.1.0 Функция rand() стала псевдонимом функции mt_rand().
7.1.0 Функцию mt_rand() обновили и теперь функция генерирует значения через корректную версию генератора случайных чисел на основе Вихря Мерсенна. Старое поведение получают через функцию mt_srand() с аргументом MT_RAND_PHP для второго параметра.

Примеры

Пример #1 Пример использования функции mt_rand()

<?php

echo mt_rand(), "\n";
echo
mt_rand(), "\n";

echo
mt_rand(5, 15), "\n";

?>

Вывод приведённого примера будет похож на:

1604716014
1478613278
6

Примечания

Внимание

Диапазон minmax не должен выходить за границы значения, которое возвращает функция mt_getrandmax(). То есть (max - min) <= mt_getrandmax(). Иначе функция mt_rand() может возвращать менее качественные случайные числа.

Смотрите также

  • mt_srand() - Инициализирует генератор случайных чисел на базе Вихря Мерсе́нна
  • mt_getrandmax() - Показывает максимально возможное значение случайного числа
  • random_int() - Получает криптографически безопасное равномерно выбранное целое число
  • random_bytes() - Получает криптографически безопасные случайные байты

Добавить

Примечания пользователей 3 notes

up
8
Pawe Krawczyk
11 years ago
To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:

http://www.openwall.com/php_mt_seed/README
up
7
greald at ghvernuft dot nl
1 year ago
To see some systematic deviations from a universal distribution run:

<?php
$alfabet
= str_split('ADHKLMNPSTUWX');
$countalfabet = count($alfabet)-1;
$code = array_fill_keys($alfabet, 0);
for (
$L=0; $L<80*$countalfabet; $L++)
{
$lettr = floor(mt_rand ( 0, $countalfabet ));
$code[$alfabet[$lettr]]++;
}

foreach(
$code as $L => $Freq)
{
for(
$F=0; $F<$Freq; $F++)
{
echo
$L;
}
echo
"\n<br/>";
}
?>
To Top