- Как получить в PHP случайное число?
- Получение случайного числа
- Получение случайной строки
- Еще более случайная строка
- Случайная удобочитаемая строка
- Получение случайных элементов из массива
- Случайные строки пароля
- Получение известной случайной строки
- rand
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- random_int
- Список параметров
- Возвращаемые значения
- Ошибки
- Список изменений
- Примеры
- Смотрите также
- User Contributed Notes 3 notes
- rand
- Список параметров
- Возвращаемые значения
- Примеры
- Примечания
- Смотрите также
Как получить в PHP случайное число?
В этой статье описаны различные способы, позволяющие получить в PHP случайное число , строк, паролей, изображений и т. д. Я использую эти методы для различных целей, а в этой статье хочу объединить информацию о них всех в одном месте.
Получение случайного числа
Этот метод полезен для добавления случайных чисел в файлы CSS и JavaScript :
function shapeSpace_randomizer()
$random_number = shapeSpace_randomizer();
Это всего лишь один из возможных способов. Возвращаемое число будет принадлежать диапазону между двумя указанными числами.
Получение случайной строки
Если вам нужна PHP генерация случайного числа или буквенно-цифровой строки, попробуйте эту функцию:
function shapeSpace_random_string($length) < $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $strlength = strlen($characters); $random = ''; for ($i = 0; $i < $length; $i++) < $random .= $characters[rand(0, $strlength - 1)]; >return $random; >
$random_string = shapeSpace_random_string(10);
Этот код выдает случайную строку, состоящую из 10 символов. Можно изменить 10 на необходимое число. Альтернативная версия функции:
function shapeSpace_random_string($length)
Применение такое же, как и для предыдущей функции.
Еще более случайная строка
Этот метод похож на предыдущий, но в нем создается еще более случайная буквенно-цифровая строка с помощью генерации случайных чисел функцией srand() :
function shapeSpace_random_string($length) < $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; srand((double)microtime()*1000000); $random = ''; for ($i = 0; $i < $length; $i++) < $random .= $characters[rand() % strlen($characters)]; >return $random; >
Применение способа получения в PHP случайного числа из диапазона:
$random_string = shapeSpace_random_string(10);
Приведенный выше код выдает случайную строку, состоящую из 10 символов. Вы можете изменить 10 на нужное число.
Случайная удобочитаемая строка
В приведенном ниже примере мы генерируем случайную строку, которая включает в себя только буквы, чтобы сделать строку понятной:
function shapeSpace_random_string_readable($length) < $c = array('b','c','d','f','g','h','j','k','l','m','n','p','r','s','t','v','w','x','y','z'); $v = array('a','e','i','o','u'); srand((double)microtime()*1000000); $max = $length / 2; $random = ''; for ($i = 1; $i return $random; >
$random_string = shapeSpace_random_string_readable(10);
Этот код выдает случайную строку, состоящую из 10 символов. Можно изменить 10 на нужное число. Его также можно использовать, чтобы сгенерировать случайное число PHP .
Получение случайных элементов из массива
Есть много способов сделать это. Основная задача — вернуть из массива случайный набор элементов. Я использую приведенный ниже метод для отображения четырех случайных объявлений ( из массива, который включает в себя восемь объявлений ):
function shapeSpace_get_random_items($length)
$random_string = shapeSpace_get_random_items(4);
Этот код выдает строку, содержащую четыре случайных элемента, разделенных пробелом. Можно задать любое число. Просто не забудьте, что оно должно быть меньше, чем общее количество элементов массива. Также можно настроить выходную строку по своему желанию.
Случайные строки пароля
Вот пример использования функций для генерации паролей на основе массива случайных чисел PHP :
function generatePassword($length=9, $strength=0) < $vowels = 'aeuy'; $consonants = 'bdghjmnpqrstvz'; if ($strength & 1) < $consonants .= 'BDGHJLMNPQRSTVWXZ'; >if ($strength & 2) < $vowels .= "AEUY"; >if ($strength & 4) < $consonants .= '23456789'; >if ($strength & 8) < $consonants .= '@#$%'; >$password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) < if ($alt == 1) < $password .= $consonants[(rand() % strlen($consonants))]; $alt = 0; >else < $password .= $vowels[(rand() % strlen($vowels))]; $alt = 1; >> return $password; >
Существует множество способов генерации случайных паролей. Но этот позволяет контролировать надежность и длину пароля. Вот пример использования кода для получения в PHP случайного числа из диапазона :
$password = generatePassword(18, 8);
Получение известной случайной строки
Я экспериментировал с простыми способами блокирования спама в создаваемом плагине чата и решил попробовать использовать поле Ajax nonce . Вот код, который я использовал для генерации nonce ( скрытый ввод ):
$nonces = array( 'Y4-B84pY:IN:;th1H$r+O8cF', 'IA/,HwsA^y@V0Rre(jF](^P+', 'kW5oJsj,M4$.>?Zf/GqqZcaz', '=1ekfx)K#_5goJ6HrifbK=Ss', '8#8r)z3=ELR;7Oqwcp3V3Nv!', 'Ei9)OuJaqYRssa]b>wut3;=m', '>TM42oi:-HppFF:XYk0OY';
Затем при обработке запроса Ajax я могу проверить пользователя, сверив представленное значение nonce с известным набором $nonces .
Обратите внимание, что этот PHP генератор случайных чисел не рекомендуется для применения на рабочих сайтах. Я рассмотрел его только потому, что он соответствует теме статьи, и может помочь в разработке различных идей тем, кто работает над подобными проектами.
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()
Результатом выполнения данного примера будет что-то подобное:
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 .
Список изменений
Версия | Описание |
---|---|
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).
Замечание: На некоторых платформах (таких как 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