Функция генерации случайных чисел php

random_int

Создаёт равномерно выбранное целое число между заданными минимумом и максимумом.

Случайная последовательность, создаваемая функцией, подходит для всех приложений, включая генерацию долгосрочных секретов, таких как ключи шифрования.

Источники случайных величин в порядке приоритета:

  • Linux: » getrandom(), /dev/urandom
  • FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom
  • Windows (PHP >= 7.2): » CNG-API Windows: » CryptGenRandom
  • macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22, если CCRandomGenerateBytes доступен во время компиляции): CCRandomGenerateBytes() macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom
  • NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom
  • OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom
  • DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom
  • Solaris (PHP >= 8.1): » getrandom(), /dev/urandom
  • Любая комбинация операционной системы и версии PHP, не указанная ранее: /dev/urandom
  • Если ни один из источников не доступен или все они не генерируют случайную величину, то будет выброшено исключение Random\RandomException .

Замечание: Эта функция была добавлена в PHP 7.0, а для версий с 5.2 по 5.6 включительно доступна » пользовательская реализация.

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

Верхняя граница диапазона.

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

Криптографически безопасное, равномерно выбранное целое число из замкнутого интервала [ min , max ]. Возможными возвращаемыми значениями являются min и max .

Ошибки

  • Если подходящие источники случайных величин отсутствуют, то выбрасывается исключение Random\RandomException .
  • Если задать max меньше чем min , то будет выброшено исключение класса ValueError .
Читайте также:  Стандартные алгоритмы в java

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

Версия Описание
8.2.0 В случае возникновения ошибки CSPRNG , функция теперь будет выбрасывать исключение Random\RandomException . Ранее выбрасывалось исключение Exception .

Примеры

Пример #1 Пример использования random_int()

Результатом выполнения данного примера будет что-то подобное:

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

  • Random\Randomizer::getInt() — Получает равномерно выбранное целое число
  • random_bytes() — Получает криптографически безопасные случайные байты

User Contributed Notes 3 notes

Here is a simple backporting function, it works for PHP >= 5.1

if (! function_exists ( ‘random_int’ )) function random_int ( $min , $max ) if (! function_exists ( ‘mcrypt_create_iv’ )) trigger_error (
‘mcrypt must be loaded for random_int to work’ ,
E_USER_WARNING
);
return null ;
>

if (! is_int ( $min ) || ! is_int ( $max )) trigger_error ( ‘$min and $max must be integer values’ , E_USER_NOTICE );
$min = (int) $min ;
$max = (int) $max ;
>

if ( $min > $max ) trigger_error ( ‘$max can\’t be lesser than $min’ , E_USER_WARNING );
return null ;
>

$range = $counter = $max — $min ;
$bits = 1 ;

$bytes = (int) max ( ceil ( $bits / 8 ), 1 );
$bitmask = pow ( 2 , $bits ) — 1 ;

if ( $bitmask >= PHP_INT_MAX ) $bitmask = PHP_INT_MAX ;
>

do $result = hexdec (
bin2hex (
mcrypt_create_iv ( $bytes , MCRYPT_DEV_URANDOM )
)
) & $bitmask ;
> while ( $result > $range );

return $result + $min ;
>
>
?>

Randomness test

$max = 100 ; // number of random values
$test = 1000000 ;

$array = array_fill ( 0 , $max , 0 );

for ( $i = 0 ; $i < $test ; ++ $i ) ++ $array [ random_int ( 0 , $max - 1 )];
>

function arrayFormatResult (& $item ) global $test , $max ; // try to avoid this nowdays 😉

$perc = ( $item /( $test / $max ))- 1 ;
$item .= ‘ ‘ . number_format ( $perc , 4 , ‘.’ , » ) . ‘%’ ;
>

array_walk ( $array , ‘arrayFormatResult’ );

Источник

rand

При вызове без параметров min и max , возвращает псевдослучайное целое в диапазоне от 0 до getrandmax() . Например, если вам нужно случайное число между 5 и 15 (включительно), вызовите rand(5, 15) .

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

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

Замечание: На некоторых платформах (таких как Windows) getrandmax() всего лишь 32767. Чтобы расширить диапазон, используйте параметры min и max , или обратитесь к функции mt_rand() .

Замечание: Начиная с PHP 7.1.0, rand() использует тот же алгоритм получения случайных чисел, что и mt_rand() . Для сохранения обратной совместимости, функция rand() позволяет задавать параметр max меньше, чем параметр min . Функция mt_rand() в такой ситуации будет возвращать false

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

Наименьшее значение, которое может быть возвращено (по умолчанию: 0)

Наибольшее значение, которое может быть возвращено (по умолчанию: getrandmax() )

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

Псевдослучайное значение в диапазоне от min (или 0) до max (или getrandmax() ).

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

Примеры

Пример #1 Пример использования rand()

Результатом выполнения данного примера будет что-то подобное:

Источник

rand

При вызове без параметров min и max , возвращает псевдослучайное целое в диапазоне от 0 до getrandmax() . Например, если вам нужно случайное число между 5 и 15 (включительно), вызовите rand(5, 15).

Замечание: На некоторых платформах (таких как Windows) getrandmax() всего лишь 32767. Чтобы расширить диапазон, используйте параметры min и max , или обратитесь к функции mt_rand() .

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

Наименьшее значение, которое может быть возвращено (по умолчанию: 0)

Наибольшее значение, которое может быть возвращено (по умолчанию: getrandmax() )

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

Псевдослучайное значение в диапазоне от min (или 0) до max (или getrandmax() ).

Примеры

Пример #1 Пример использования rand()

Результатом выполнения данного примера будет что-то подобное:

Примечания

Данная функция не генерирует криптографически безопасные значения и не должна использоваться в криптографических целях. Если вам требуется криптографически безопасное значение, подумайте об использовании функции openssl_random_pseudo_bytes() вместо данной.

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

  • srand() — Изменяет начальное число генератора псевдослучайных чисел
  • getrandmax() — Возвращает максимально возможное случайное число
  • mt_rand() — Генерирует случайное значение методом mt
  • openssl_random_pseudo_bytes() — Generate a pseudo-random string of bytes

Источник

Генерация случайных буквенно-цифровых строк в PHP

Monty Shokeen

Monty Shokeen Last updated Nov 23, 2020

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

То же самое применимо к генерации случайных чисел и буквенно-цифровых строк. Самое лучшее, на что мы можем надеяться, это генерировать числа и строки, которые не следуют шаблону и не могут быть практически предсказаны злоумышленником.

В этом уроке мы рассмотрим различные методы генерации случайных чисел и буквенно-цифровых строк в PHP. Некоторые из них будут криптографически безопасны, а другие предназначены только для случайного использования, например, назначение псевдослучайных имен файлов или создание URL-адресов и предложение имен пользователей.

Создание случайных чисел в PHP

Существуют три различные функции для генерации случайных чисел в PHP. Все они будут принимать минимальное и максимально возможное значение для случайных чисел и выдавать случайное число для вас. Это rand($min, $max) , mt_rand($min, $max) и random_int($min, $max) .

С rand() минимальные и максимальные значения целых чисел, которые вы можете генерировать, лежат между 0 и значением, возвращаемым функцией getrandmax() . До PHP 7.1.0 эта функция была примерно в четыре раза медленнее, чем mt_rand() . Однако, начиная с PHP 7.1.0, она была создана как псевдоним mt_rand() . В отличие от mt_rand() , вы можете установить значение $max меньше, чем $min , не вызывая ошибки.

С mt_rand() минимальные и максимальные значения целых чисел, которые вы можете генерировать, лежат между 0 и значением, возвращаемым mt_getrandmax() . Функция использует реализацию Mersenne Twister для генерации случайных чисел. Остерегайтесь, до PHP 7.1.0, эта функция реализовывала неверную версию алгоритма для генерации чисел. Однако он был исправлен в более новых версиях.

Функция стала еще лучше в PHP 7.2.0, избавившись от ошибки модульного смещения. Это означает, что для некоторых конкретных значений ваша последовательность случайных чисел теперь будет немного лучше по сравнению со старыми версиями. Однако какой-то специализированный код может действительно полагаться на эту предвзятость. Если это так, вы можете использовать более старый алгоритм, вызвав функцию mt_srand() для задания начального числа для генератора случайных чисел и передачи MT_RAND_PHP в качестве значения второго параметра.

Функция mt_rand() имеет период 2 19937 -1, что в основном означает, что в наилучших сценариях вы получаете целых 2 19937 -1 случайных чисел до того, как последовательность начнет повторяться. Следует отметить, что повторение последовательности не совпадает с повторением определенного числа. Другими словами, вы можете получить одно и то же случайное число дважды, но это не значит, что сама последовательность начала повторяться. Примером может служить следующая последовательность:

187 3276 1267 15 1267 34598 3467 125 17

В приведенной выше последовательности у нас было 1267 два раза на выходе, но это не означает, что после этого вся последовательность начала повторяться. Маловероятно, чтобы такое же число повторялось так быстро в случайной последовательности, но это возможно!

Криптографически безопасные случайные целые числа

Если вы хотите криптографически безопасные псевдослучайные числа, функция random_int() в PHP — ваш лучший выбор. Он будет генерировать случайные числа между предоставленными значениями $min и $max , которые по умолчанию соответствуют PHP_INT_MIN и PHP_INT_MAX . К сожалению, эта функция доступна только с PHP 7.0. Для версий до этого вы можете использовать этот полифилл на GitHub.

Случайные числа с плавающей точкой

Вместо генерации случайных целых чисел вы также можете генерировать числа с плавающей точкой. Это можно сделать легко, просто разделив случайное число на значение, возвращаемое mt_getrandmax() . В следующем примере будет проиллюстрировано, как создать случайное значение с плавающей точкой от 0 до 1 или между любыми другими минимальными и максимальными пределами.

Источник

Функция генерации случайных чисел php

315

310

8051

428

7086

18

Источник

Оцените статью