php функция рандомного числа
Случайность в PHP7 – Повезет ли мне?
В этой статье мы проанализируем проблемы, относящиеся к генерации случайных чисел, используемых в криптографии. PHP5 не обеспечивает простой механизм генерации криптостойких случайных чисел, в то время как PHP7 решает эту проблему путем введения CSPRNG-функций.
Что такое CSPRNG?
Цитируя википедию, криптографически стойкий генератор псевдослучайных чисел (англ. Cryptographically secure pseudorandom number generator, CSPRNG) — это генератор псевдослучайных чисел с определёнными свойствами, позволяющими использовать его в криптографии.
CSPRNG в PHP7
random_int возвращает целое число в заданном диапазоне:
За кадром
Простой тест
Хорошая система генерации случайных чисел определяется «качеством» генераций. Чтобы его проверить часто используется набор статистических тестов, позволяющих, не вникая в сложную тему статистики, сравнить известное эталонное поведение с результатом генератора и помочь в оценке его качества.
График будет выглядеть так (чем ближе к нулю, тем лучше):
А что насчет PHP5?
Если вы хотите начать использовать хороший генератор случайных чисел и в то же время пока еще не готовы к переходу на PHP7, вы можете использовать библитеку random_compat от Paragon Initiative Enterprises. Она позволяет использовать random_bytes() и random_int() в PHP 5.х проектах.
Библиотеку можно установить через Composer:
Дополнительную информацию о том почему используется именно этот порядок вы можете прочитать в документации.
Пример генерации пароля с использованием библиотеки:
Краткий итог
Вы всегда должны применять криптографически стойкие генераторы псевдослучайных чисел, и random_compat является хорошим решением для этого.
array_rand
(PHP 4, PHP 5, PHP 7, PHP 8)
array_rand — Выбирает один или несколько случайных ключей из массива
Описание
Выбирает одно или несколько случайных значений из массива. Возвращает ключ (или ключи) данных случайных элементов. Данная функция использует псевдослучайный генератор и не предназначена для использования в криптографических целях.
Список параметров
Определяет количество выбираемых элементов.
Возвращаемые значения
Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям. Это сделано для того, чтобы дать возможность выбрать из массива как случайные значения, так и случайные ключи. Если возвращается несколько ключей, они будут возвращены в том порядке, в котором они присутствовали в исходном массиве. Попытка выбрать больше элементов, чем есть в массиве, сгенерирует ошибку уровня E_WARNING и вернёт NULL.
Список изменений
Версия | Описание |
---|---|
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна. |
Примеры
Пример #1 Пример использования array_rand()
Смотрите также
User Contributed Notes 4 notes
Сгенерировать случайное число в PHP
Использование rand()
Эта функция используется для генерации случайного целого числа. Синтаксис этой функции приведен ниже.
Он возвращает большое случайное целое число, если в функции не используется параметр. Если в этой функции указаны два значения аргумента, она вернет случайное целое число на основе значений аргументов. Использование этой функции показано ниже.
Пример 1: Различные варианты использования функции rand()
В следующем примере показаны три различных использования функции rand() для генерации случайного числа. Сначала функция rand() вызывается два раза без аргументов, чтобы показать, как по умолчанию генерируются случайные числа. Затем он вызывается два раза с двумя разными минимальным и максимальным значениями. Наконец, он вызывается дважды с помощью побитового оператора.
Аналогичный результат появится после запуска скрипта с сервера. Первый вывод показывает два разных больших числа. На втором выходе первое случайное число было сгенерировано в диапазоне от 10 до 100, а второе случайное число было сгенерировано в диапазоне от 100 до 500. На третьем выходе первое случайное число было сгенерировано в пределах диапазон от 0 до 10, а второе случайное число было сгенерировано в диапазоне от 0 до 50.
Использование random_int()
Эта функция используется для генерации криптографически псевдобезопасного случайного числа. Функция системного вызова getrandom (2) используется в Ubuntu для генерации криптографического случайного числа. Эта функция более безопасна, чем функция rand(), потому что сгенерированное число непредсказуемо. Но random_int() медленнее, чем функция rand(). Синтаксис этой функции приведен ниже.
В функции используются два аргумента, чтобы установить диапазон для генерации криптографического случайного числа. Первый аргумент используется для установки наименьшего значения, а второй аргумент используется для установки наибольшего значения числа. Использование этой функции показано ниже.
Пример 2: Различные варианты использования функции random_int()
В следующем примере показано использование функции random_int() для генерации случайного числа путем предоставления минимального и максимального значений. Эти значения могут быть целыми или плавающими, но минимальное не может быть больше максимального. В первой функции random_int() положительные целые числа используются как минимальное и максимальное значения. Во второй функции random_int() отрицательное целое число используется как минимум, а положительное целое число используется как максимальное значение. В третьей функции random_int() плавающие числа используются как минимальное и максимальное значения.
Следующий аналогичный вывод появится после запуска сценария с сервера.
Использование mt_rand()
Эта функция используется для генерации высококачественных псевдослучайных чисел с помощью генератора Mersenne Twister. Работает быстрее, чем функция rand(). Синтаксис этой функции приведен ниже.
Как и функция rand(), она может принимать два аргумента для установки максимального и минимального значений, и эту функцию также можно использовать без каких-либо аргументов. Использование этой функции показано ниже.
Пример 3: Различные варианты использования функции mt_rand()
В следующем примере показано использование функции mt_rand() с аргументами и без них. Первая функция mt_rand() вызывается без каких-либо аргументов, которая генерирует большое целое число. Вторая функция mt_rand() вызывается с минимальным и максимальным значением, которое будет генерировать число в заданном диапазоне.
Следующий аналогичный вывод будет сгенерирован после запуска сценария с сервера. Первый вывод показывает, что было сгенерировано большое целое число, когда в функции mt_rand() не использовался аргумент.
Заключение
В этой статье на простых примерах были объяснены три различных способа создания случайного числа в PHP. Лучше использовать функцию random_int(), когда важна безопасность, но лучше использовать функцию mt_rand(), когда требуется быстрее сгенерировать случайное число. Функция rand() может использоваться для генерации простого случайного числа.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Генерация случайных буквенно-цифровых строк в PHP
Позвольте мне начать этот пост, сказав, что почти ни одно событие не является случайным. Даже исход классического броска монеты теоретически можно было бы предсказать, если бы мы знали о влиянии каждого фактора, например, трения, гравитации и начальной силы.
То же самое применимо к генерации случайных чисел и буквенно-цифровых строк. Самое лучшее, на что мы можем надеяться, это генерировать числа и строки, которые не следуют шаблону и не могут быть практически предсказаны злоумышленником.
В этом уроке мы рассмотрим различные методы генерации случайных чисел и буквенно-цифровых строк в PHP. Некоторые из них будут криптографически безопасны, а другие предназначены только для случайного использования, например, назначение псевдослучайных имен файлов или создание URL-адресов и предложение имен пользователей.
Создание случайных чисел в PHP
Функция стала еще лучше в PHP 7.2.0, избавившись от ошибки модульного смещения. Это означает, что для некоторых конкретных значений ваша последовательность случайных чисел теперь будет немного лучше по сравнению со старыми версиями. Однако какой-то специализированный код может действительно полагаться на эту предвзятость. Если это так, вы можете использовать более старый алгоритм, вызвав функцию mt_srand() для задания начального числа для генератора случайных чисел и передачи MT_RAND_PHP в качестве значения второго параметра.
В приведенной выше последовательности у нас было 1267 два раза на выходе, но это не означает, что после этого вся последовательность начала повторяться. Маловероятно, чтобы такое же число повторялось так быстро в случайной последовательности, но это возможно!
Криптографически безопасные случайные целые числа
Случайные числа с плавающей точкой
Изменение начального числа генераторов случайных чисел
Важно помнить, что предоставление начального значения случайного числа за один раз до вызова rand() и mt_rand() не обязательно приведет к получению более качественных случайных чисел. Фактически, использование одного и того же начального случайного числа каждый раз даст вам одно и то же случайное число!
Изменение случайного числа полезно в ситуациях, когда вы хотите создать случайную, но воспроизводимую последовательность. Следующий фрагмент кода генерирует одну и ту же последовательность случайных чисел при повторном запуске.
Генерация случайных буквенно-цифровых строк в PHP
Существует множество способов генерации случайных буквенно-цифровых строк, и то, что вы используете, будет зависеть от ваших потребностей.
Создание перетасованных строк
Помните, что случайная строка, сгенерированная таким образом, не является криптографически безопасной. Тем не менее, строка по-прежнему будет довольно непредсказуемой для общего использования, например, для генерации случайных имен файлов или URL-адресов. Вот несколько примеров:
В обоих случаях ваш результат, скорее всего, будет разным. В первом случае мы просто перетасовали допустимую строку символов, а затем взяли первые 10 символов. Во втором случае мы добавили «video» в начале сгенерированной строки и «.mp4» в конце.
Этот способ генерации случайных буквенно-цифровых строк очень прост, но у него есть несколько проблем. Например, вы никогда не получите одинаковые символы в своей случайной строке дважды. Кроме того, длина строки случайного вывода может достигать только длины входной строки.
Создание случайных строк
Если проблемы, перечисленные выше, являются неприемлемыми, вы можете посмотреть на некоторые другие реализации. Следующий код поможет решить эти проблемы.
Создание случайных шестнадцатеричных строк
Ниже приведен пример вывода, возвращаемого этими функциями:
Как вы можете видеть, генерация случайных и уникальных шестнадцатеричных строк длиной до 40 символов очень проста в PHP.
Генерация криптографически безопасных случайных строк
Заключительные мысли
В этом уроке мы рассмотрели генерацию случайных чисел и буквенно-цифровых строк в PHP. Генерация случайных чисел может быть полезна в самых разных ситуациях, например, в играх, в которых вы должны порождать вражеских игроков или произвольно давать пользователям некоторые подсказки о письмах, чтобы они могли сформировать целое слово.
Подобно случайным числам, генерация случайных буквенно-цифровых строк также может быть весьма полезной во многих случаях. С помощью str_shuffle() вы можете выбрать, какой набор символов появится в ваших случайных строках. С помощью sha1() и md5() вы можете легко генерировать случайные шестнадцатеричные последовательности, а с помощью random_bytes() вы можете генерировать криптографически защищенные строки. Это позволит вам генерировать осмысленные, но рандомизированные имена файлов и имена пользователей, которые трудно подобрать.
Надеюсь, вам понравился этот урок. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях.
Php функция рандомного числа
Производит инициализацию генератора случайных чисел. Синтаксис:
Инициализирует генератор случайных чисел значением seed.
Возвращает максимально возможное случайное число. Синтаксис:
Эта функция возвращает максимальное значение, которое можно получить при помощи функции генерации случайных чисел rand().
Производит генерацию случайного числа. Синтаксис:
При вызове с необязательными параметрами min и max эта функция генерирует случайное число, лежащее в пределах этих параметров включительно. Если параметры min и max отсутствуют, возвращается число, лежащее в пределах от 0 до RAND_MAX.
Для корректной работы данной функции перед ее использованием нужно проинициализировать генератор случайных чисел функцией srand().
LCG-генератор псевдо-случайных чисел (PHP 4, PHP 5)
Показывает наибольшее возможное случайное значение (PHP 3 >= 3.0.6, PHP 4, PHP 5)
Показывает максимальное значение, которое может быть возвращено функцией mt_rand()
Генерирует лучшее случайное значение (PHP 3 >= 3.0.6, PHP 4, PHP 5)
Многие генераторы случайных чисел старых версий имеют сомнительные характеристики и работают медленно. По умолчанию PHP использует генератор случайных чисел функции rand(). Функция mt_rand() является хорошей ее заменой. Она использует рандомный генератор чисел, работающий в 4 раза быстрее, чем rand(), и использующий Mersenne Twister.
Вызванная без необязательных аргументов min и max, mt_rand() возвращает псевдо-случайное значение, расположенное между 0 и RAND_MAX. При необходимости получить, к примеру, случайные значения между 5 и 15 включительно, ишется mt_rand (5, 15).
Пример применения mt_rand()
Результатом выполнения данного примера будет что-то подобное:
Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.
Замечание: В версиях до 3.0.7 второй параметр функции указывал диапазон чисел. Например, для получения случайных чисел между 5 и 15 в этих версиях требуется задать функцию mt_rand (5, 11).
Устанавливает начальное значение лучшего генератор случайных чисел (PHP 3 >= 3.0.6, PHP 4, PHP 5)
Устанавливает начальное значение генератора случайных чисел с помощью seed. Начиная с PHP 4.2.0, seed не является обязательной, и установки по умолчанию для случайных значений опускаются.
Пример использования mt_srand()
Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.