Генерация числа PHP 7 функции random_bytes() и random_int()


Содержание материала:

PHP rand() vs. random_int()

Как php.net указывает: random_int() функция Генерирует криптографически защищенные псевдослучайные целые числа.

Но может ли кто-нибудь объяснить, в чем разница между rand() и random_int() ? Могу ли я использовать random_int() вместо rand() , когда требуется только случайное целое число? Какой из них быстрее?

Повторяя вопрос и увидев ответ, я считаю справедливым, что я отправляю свои комментарии на ответ, видя, что они были представлены раньше.

В руководстве по функции PHP 7 random_int() указано:

«Возвращает криптографически защищенное случайное целое число в диапазоне от min до max, включительно.»

* Эта функция не генерирует криптографически безопасные значения «*

«@Fred-ii- спасибо. Но что означает» криптографически безопасное псевдослучайное «? — NDFA»

Это можно найти в следующих ссылках в соответствии с моими выводами:

Криптографически защищенный генератор псевдослучайных чисел (CSPRNG) или криптографический генератор псевдослучайных чисел (CPRNG) [1] — генератор псевдослучайных чисел (PRNG) со свойствами, которые делают его пригодным для использования в криптографии.

Что касается производительности, вам нужно будет запустить тест самостоятельно.

Генерация числа PHP 7: функции random_bytes() и random_int()

(PHP 4, PHP 5, PHP 7)

rand — Генерирует случайное число

Описание

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

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

Замечание: На некоторых платформах (таких как 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() ).

Получение случайных элементов с помощью PHP

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

Получение случайного числа

Этот метод полезен для добавления случайных чисел в файлы CSS и JavaScript :

Это всего лишь один из возможных способов. Возвращаемое число будет принадлежать диапазону между двумя указанными числами.

Получение случайной строки

Если вам нужна PHP генерация случайного числа или буквенно-цифровой строки, попробуйте эту функцию:

Этот код выдает случайную строку, состоящую из 10 символов. Можно изменить 10 на необходимое число. Альтернативная версия функции:

Применение такое же, как и для предыдущей функции.

Еще более случайная строка

Этот метод похож на предыдущий, но в нем создается еще более случайная буквенно-цифровая строка с помощью генерации случайных чисел функцией srand() :

Применение способа получения в PHP случайного числа из диапазона:

Приведенный выше код выдает случайную строку, состоящую из 10 символов. Вы можете изменить 10 на нужное число.

Случайная удобочитаемая строка

В приведенном ниже примере мы генерируем случайную строку, которая включает в себя только буквы, чтобы сделать строку понятной:

Этот код выдает случайную строку, состоящую из 10 символов. Можно изменить 10 на нужное число. Его также можно использовать, чтобы сгенерировать случайное число PHP .

Получение случайных элементов из массива

Есть много способов сделать это. Основная задача — вернуть из массива случайный набор элементов. Я использую приведенный ниже метод для отображения четырех случайных объявлений ( из массива, который включает в себя восемь объявлений ):

Этот код выдает строку, содержащую четыре случайных элемента, разделенных пробелом. Можно задать любое число. Просто не забудьте, что оно должно быть меньше, чем общее количество элементов массива. Также можно настроить выходную строку по своему желанию.

Случайные строки пароля

Вот пример использования функций для генерации паролей на основе массива случайных чисел PHP :

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

Получение известной случайной строки

Я экспериментировал с простыми способами блокирования спама в создаваемом плагине чата и решил попробовать использовать поле Ajax nonce . Вот код, который я использовал для генерации nonce ( скрытый ввод ):

Затем при обработке запроса Ajax я могу проверить пользователя, сверив представленное значение nonce с известным набором $nonces .

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

Данная публикация представляет собой перевод статьи « Get Random with PHP » , подготовленной дружной командой проекта Интернет-технологии.ру

Генератор чисел рандом

17.02.2015, 14:51

генератор чисел
Добрый вечер, как генерировать ключ(цифр) из матрицы Вот пример $matrix =.

Генератор случайных чисел
Вот форма на HTML: Минимальное значение:
.

Генератор вещественных чисел
Написал вот так. function generationRealNumber($startOfTheInterval,$endOfTheInterval) <.

Управляемый генератор чисел
как сделать так чтобы с генерировать одно случайное число в диапазоне от 0 до 9 но при этом задать.

17.02.2015, 15:03 2 17.02.2015, 15:21 3

О php функции mt_rand

17.02.2015, 15:24 [ТС] 4
17.02.2015, 15:24
17.02.2015, 15:28 5

mt_rand работаете быстрее rand и числа выдает которые сильнее случайные чем случайность ф-и rand.

Проще говоря mt_rand круче и правильнее чем rand.

17.02.2015, 15:36 6
17.02.2015, 15:39 [ТС] 7
17.02.2015, 15:41 8
24.04.2020, 11:43 9

Всем здрасти.
Подскажите как можно сделать так чтобы функция возвращала случайное число из определенного количества знаков?
Ну т.е. я ввожу диапазон 0000000-9999999, мне надо чтобы число получилось например 0012300. эти функиции рандома чисел генерируют число из этого диапазона(echo mt_rand(0000000, 9999999) в виде — например 12345. Т.е. состоящее из 5 знаков. Надо чтобы число было всегда из допустим 7 знаков, например 0000001.

Добавлено через 12 минут
Сразу сюда же вопросик, я генерирую число, затем проверяю нет ли такого в базе, если нет то заношу его туда, если есть то надо снова сделать генерацию и снова проверить. Как это сделать?
ну т.е. я пишу

24.04.2020, 13:59 10

Здрасти! Что бы переменная хранящая число была с предваряющими число нулями нужно её преобразовать в строку после генерации через mt_rand() с помощью функции set_type(), задать тип string, и, дописать определенное необходимое количество нулей спереди цифры.

А если надо случайное число определенной длины значащих цифр, можете использовать вот такую функцию:

. написал её только что, на досуге. Не много проверил — вроде правильно работает. Просто вызываете ф-ю get_integer_rnd_len() и передаете ей в качестве аргумента число которое задает длину возвращаемого случайного целого числа. Если аргумент ф-и не передаете, то генерируется случайное число длиной 8 цифр, это при вызове ф-и без аргумента. В знак того, что в байте 8 бит Так, по-програмистки, верно?

Enamy, хочу Вам сказать что вы не много нарушили правила (имхо) на кибер форуме :rtfm:: вы дописали свой вопрос в уже существующей теме от форумчанина Амурский, 2015 года создания. Вам следовало бы создать отдельную тему со своим вопросом в разделе PHP для начинающих. Если модератор увидит — он должен вынести ваш пост в отдельную тему. Это. так, на всяк-случай 🙂 Для порядку 🙂

Тут и правил знать не надо — зачем дописывать свой вопрос в другой, тем более, старой теме?!


Далее, по теме. Enamy, в цифре 0000001 значащее число ОДНО , нулей ШЕСТЬ , а всего символов СЕМЬ . Если смотреть на цифру заданную в виде 0000001 как на строку — в ней семь символов. Если смотреть на цифру 0000001 заданную как цифра — то в ней ОДНА цифра. В PHP, если не ошибаюсь, да может и в любом языке программирования не возможно сохранить в переменной цифру, скажем 0001 — нули предваряющие значения не имеют, они отбрасываются ( ЭТО НЕ СТРОКА! ) и сохранится только цифра 1. Понимаете? В общем — понятно, Вы не много запутались, с этими знаками. Сам не знаю как этот момент Вам объяснить, потому что тоже, чуток запутался .

KOPOJI, ты здесь? Как, это, ещё, объяснить? :scratch:

Random int

Fetch a random integer between $min and $max inclusive

Возвращает

Использование

Код random int: wp-includes/random_compat/random_int.php VER 5.0.2

This function is based on Andrew Moore’s UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand().

function generateUUIDv4()
<
if(version_compare(PHP_VERSION,’7.0.0′, ‘

// 32 bits for «time_low»
random_int(0, 0xffff), random_int(0, 0xffff),

// 16 bits for «time_mid»
random_int(0, 0xffff),

// 16 bits for «time_hi_and_version»,
// four most significant bits holds version number 4
random_int(0, 0x0fff) | 0x4000,

// 16 bits, 8 bits for «clk_seq_hi_res»,
// 8 bits for «clk_seq_low»,
// two most significant bits holds zero and one for variant DCE1.1
random_int(0, 0x3fff) | 0x8000,

// 48 bits for «node»
random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff)
);
>
>

Что такое CSPRNG?

Цитируя википедию, криптографически стойкий генератор псевдослучайных чисел (англ. Cryptographically secure pseudorandom number generator, CSPRNG) — это генератор псевдослучайных чисел с определёнными свойствами, позволяющими использовать его в криптографии.

CSPRNG в основном используется для следующих целей:

  • Генерация ключей (в том числе, генерация public/private ключей)
  • Создание случайных паролей для аккаунтов пользователей
  • Системы шифрования

Главным аспектом сохранения высокого уровня безопасности является высокое качество случайности.

CSPRNG в PHP7

PHP7 вводит две новых функции, которые могут быть использованы для CSPRNG: random_bytes и random_int .

Функция random_bytes возвращает строку и принимает в качестве входных параметров int , задающий длину (в байтах) возвращаемого значения:

random_int возвращает целое число в заданном диапазоне:

За кадром


Источники случайности вышеперечисленных функций отличаются в зависимости от среды:

  • В Windows всегда будет использоваться CryptGenRandom();
  • На других платформах — при условии доступности будет задействована arc4random_buf() (верно в случае BSD-производных систем или систем с libbsd ).
  • В случае недоступности вышеобозначенного, в Linux будет использоваться системный getrandom(2) .
  • Если все это терпит неудачу, в качестве финальной попытки PHP попробует задействовать /dev/urandom .
  • При невозможности использовать эти источники будет выброшена ошибка.

Простой тест

Хорошая система генерации случайных чисел определяется «качеством» генераций. Чтобы его проверить часто используется набор статистических тестов, позволяющих, не вникая в сложную тему статистики, сравнить известное эталонное поведение с результатом генератора и помочь в оценке его качества.

Один из самых простых тестов — игра в кости. Предполагаемая вероятность выпадения шестерки при одной кости — один к шести, в то же время, если я брошу три кости 100 раз, то ожидаемые выпадения 1, 2 и 3х шестерок примерно такие:

  • 0 шестерок = 57.9 раз
  • 1 шестерка = 34.7 раз
  • 2 шестерки = 6.9 раз
  • 3 шестерки = 0.5 раз

Вот код для воспроизведения броска костей 1 000 000 раз:

Прогонка кода в PHP7 c использованием random_int и простого rand выдаст следующие результаты:

Шестерки Ожидаемый результат random_int rand
579000 579430 578179
1 347000 346927 347620
2 69000 68985 69586
3 5000 4658 4615

Для лучшего сравнения rand и random_int построим график результатов, применяя формулу: результат PHP — ожидаемый результат / sqrt(ожидаемый результат) .

График будет выглядеть так (чем ближе к нулю, тем лучше):

Даже несмотря на плохой результат с тремя шестерками и всю простоту теста, мы видим явное превосходство random_int над rand .

А что насчет PHP5?

По умолчанию, PHP5 не предусматривает каких-либо сильных псевдо-генераторов случайных чисел. Но на самом деле есть несколько вариантов, таких как openssl_random_pseudo_bytes()
, mcrypt_create_iv() или непосредственное использование /dev/random или /dev/urandom с fread() . Есть также такие библиотеки, как RandomLib или libsodium.

Если вы хотите начать использовать хороший генератор случайных чисел и в то же время пока еще не готовы к переходу на PHP7, вы можете использовать библитеку random_compat от Paragon Initiative Enterprises. Она позволяет использовать random_bytes() и random_int() в PHP 5.х проектах.

Библиотеку можно установить через Composer:

По сравнению с PHP7, random_compat использует несколько другие приоритеты:

  1. fread() /dev/urandom если доступно
  2. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV)
  3. COM(‘CAPICOM.Utilities.1’)->GetRandom()
  4. openssl_random_pseudo_bytes()

Дополнительную информацию о том почему используется именно этот порядок вы можете прочитать в документации.

Пример генерации пароля с использованием библиотеки:

Краткий итог

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

Если же вам необходим надежный источник случайных данных, то посмотрите в сторону random_int и random_bytes .

This function is based on Andrew Moore’s UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand().

function generateUUIDv4()
<
if(version_compare(PHP_VERSION,’7.0.0′, ‘
// 16 bits, 8 bits for «clk_seq_hi_res»,
// 8 bits for «clk_seq_low»,
// two most significant bits holds zero and one for variant DCE1.1
mt_rand(0, 0x3fff) | 0x8000,

// 48 bits for «node»
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
>
else
<
return sprintf(‘%04x%04x-%04x-%04x-%04x-%04x%04x%04x’,

// 32 bits for «time_low»
random_int(0, 0xffff), random_int(0, 0xffff),

// 16 bits for «time_mid»
random_int(0, 0xffff),

// 16 bits for «time_hi_and_version»,
// four most significant bits holds version number 4
random_int(0, 0x0fff) | 0x4000,

// 16 bits, 8 bits for «clk_seq_hi_res»,
// 8 bits for «clk_seq_low»,
// two most significant bits holds zero and one for variant DCE1.1
random_int(0, 0x3fff) | 0x8000,

// 48 bits for «node»
random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff)
);
>
>

Вопрос выглядит очень просто, но ответ немного сложный. Если вы видите, что почти все предложили использовать класс Random, а некоторые предложили использовать класс криптовагонов RNG. Но тогда, когда выбирать, что.

Для этого нам нужно сначала понять термин RANDOMNESS и философию, стоящую за ним.

Я бы посоветовал вам посмотреть это видео, которое подробно изложено в философии RANDOMNESS, используя C # https://www.youtube.com/watch?v=tCYxc-2-3fY

Во-первых, давайте понять философию RANDOMNESS. Когда мы говорим человеку, чтобы выбрать между RED, GREEN и YELLOW, что происходит внутри страны. Что заставляет человека выбирать КРАСНЫЙ или ЖЕЛТЫЙ или ЗЕЛЕНЫЙ?

Некоторая первоначальная мысль идет в ум людей, который решает его выбор, это может быть любимый цвет, удачный цвет и так далее. Другими словами, некоторый начальный триггер, который мы называем RANDOM как SEED. Этот SEED является начальной точкой, триггером, который подталкивает его к выбору значения RANDOM.

Теперь, если SEED легко догадаться, тогда такие случайные числа называются PSEUDO, и когда семя трудно угадать, эти случайные числа называются SECURED случайными числами.

Например, человек выбирает цвет в зависимости от комбинации погоды и звука, тогда было бы трудно угадать исходное семя.

Теперь позвольте мне сделать важное заявление:

* «Случайный» класс генерирует только случайное число PSEUDO и генерирует безопасное случайное число, которое нам нужно использовать для класса «RNGCryptoServiceProvider».

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

В то время как класс RNGCryptoServiceProvider использует энтропию OS для генерации семян. Энтропия ОС — это случайное значение, которое генерируется с использованием звука, щелчка мышью и таймингов клавиатуры, термической температуры и т. Д. Ниже приведен код для того же самого.

Чтобы понять энтропию ОС, см. Это видео с 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY где объясняется логика энтропии ОС. Таким образом, вводя простые слова, RNG Crypto генерирует безопасные случайные числа.

Доброго времени суток! Эта статья носит практический характер и в ней я расскажу о том, как использовать генератор случайных чисел в C# и для чего это Вам может пригодиться. Хотя, если на чистоту, то речь пойдет о генераторе псевдослучайных чисел…

Где нам могут понадобиться случайные числа, да на самом деле можно привести в пример много случаев, например, криптография, или механизмы разрешения различных коллизий. Поверьте, рано или поздно Вам с такой необходимостью придется столкнуться, если уже не пришлось, раз читаете эту статью. К счастью, в C# генератор случайных чисел разработан до нас, и единственное что нам нужно будет, большинстве случаев, это просто правильно им пользоваться. И так, для генерации случайных чисел в программах, написанных на C#, предназначен класс «Random».

Как видите — ничего сложного! Сначала создаем объект типа «Random», потом вызываем его метод «Next», в результате чего и получаем случайное число. Если мы вызовем метод «Next» несколько раз, то получим разные числа. Такой код, даст нам четыре разных, случайных числа:

А теперь, давайте слегка усложним задачу, представим, что нам нужно получить случайное число в определенном диапазоне. Но и эта задача выполняется довольно просто:

Как видите, и это выполняется несложно! Для этого мы всего лишь вызвали метод «Next» с двумя параметрами, первый из которых обозначает нижнюю границу диапазона, а второй — верхнюю.

Кстати, ограничить можно только верхнюю границу диапазона, для этого нужно вызвать метод «Next» с одним параметром, который и будет обозначать верхнюю границу.

Но это ещё не всё, есть еще один важный нюанс, на самом деле генератор случайных чисел является генератором псевдослучайных чисел, т.е. числа, которые он возвращает, не являются чисто случайными, они «вырабатываются» по определенным и четким законам, а «случайность» зависит от инициализации объекта, который генерирует числа (объекта класса «Random»). В примерах, приведенных выше, мы использовали конструктор по умолчанию, и в таком случае (судя по всему), «начальное значение» задается системой, и на основании системного времени. Но мы может задавать это самое «начальное значение» и сами:

Только обратите внимание, начальное значение используется для генерации чисел, а не для возвращения первого числа, т.е. первое сгенерированное число не будет тем, что указано при создании объекта.

Так вот если два (или более) разных объекта класса «Random» будут одинаково проинициализированы, то и возвращать они будут одни и те же числа, например, следующий код, выведет в консоль три одинаковых числа:

Как видите, не смотря на то, что в при каждом вызове метода «GetRandom» создается новый объект для генерации случайных чисел, инициализируются эти объекты одним и тем же значением. Так что, будьте внимательны!

The question looks very simple but the answer is bit complicated. If you see almost everyone has suggested to use the Random class and some have suggested to use the RNG crypto class. But then when to choose what.

For that we need to first understand the term RANDOMNESS and the philosophy behind it.

I would encourage you to watch this v >

First thing let us understand the philosophy of RANDOMNESS. When we tell a person to choose between RED, GREEN and YELLOW what happens internally. What makes a person choose RED or YELLOW or GREEN?

Some initial thought goes into the persons mind which decides his choice, it can be favorite color , lucky color and so on. In other words some initial trigger which we term in RANDOM as SEED.This SEED is the beginning point, the trigger which instigates him to select the RANDOM value.

Now if a SEED is easy to guess then those kind of random numbers are termed as PSEUDO and when a seed is difficult to guess those random numbers are termed SECURED random numbers.

For example a person chooses is color depending on weather and sound combination then it would be difficult to guess the initial seed.

Now let me make an important statement:-

*“Random” class generates only PSEUDO random number and to generate SECURE random number we need to use “RNGCryptoServiceProvider” class.

Random class takes seed values from your CPU clock which is very much predictable. So in other words RANDOM class of C# generates pseudo random numbers , below is the code for the same.

While the RNGCryptoServiceProvider class uses OS entropy to generate seeds. OS entropy is a random value which is generated using sound , mouse click and keyboard timings , thermal temp etc. Below goes the code for the same.

Как сделать на PHP генерацию рандомного числа?

Нужно:
1. Сгенерировать рандомное число в диапазоне от 10 до 220;
2. Поместить полученное число в переменную;
3. Умножить полученное число на 12;
4. Вставить рандомное число с п.1 и полученное в п.3

Рандомное число с п.1

Результат полученный в п.3
Так не работает:

  • Вопрос задан более года назад
  • 1189 просмотров

Код работы с числами верный, а вот вывод нет.

+ Если вывод в шаблоне, то

Во первых. Вы должны сказать что у вас не работает. Во вторых, при попытке выполнить код вы должны были получить сообщение об ошибке в котором указана строка и проблема.

Две ошибки:
1. В строке echo $result, » «, «баллов»
; — Здесь
должен быть внутри кавычек. Все строковые значения в PHP должны быть внутри кавычек.

2. Вы совершенно не различаете PHP и HTML. Чтобы сделать вставку PHP в HTML первый надо заключить в .

Другие косяки
— rand() — дает плохой рандом, имеет проблемы на разных платформах. Вместо нее следует использовать mt_rand() а для криптографически безопасных значений random_int()
— echo $basik, » «, «начислено»; излишне писать , » » вы можете прижать пробел к следующему значению echo $basik, » начислено»; — эквивалентно, но чище.

Генерация числа PHP 7: функции random_bytes() и random_int()

(PHP 4, PHP 5, PHP 7)

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()

echo rand () . «\n» ;
echo rand () . «\n» ;

echo rand ( 5 , 15 );
?>

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

Примечания

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

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

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


Коментарии

Don’t forget, it’s faster to use bitwise operations when you need a random number that’s less than some power of two. For example,

()& 1 ;
// instead of
rand ( 0 , 1 );
// for generating 0 or 1,

rand ()& 3 ;
// instead of
rand ( 0 , 3 );
// for generating 0, 1, 2, or 3,

rand ()& 7 ;
// instead of
rand ( 0 , 7 )
// for generating 0, 1, 2, 3, 4, 5, 6, or 7,
?>

and so on. All you’re doing there is generating a default random number (so PHP doesn’t have to parse any arguments) and chopping off the piece that’s useful to you (using a bitwise operation which is faster than even basic math).

Lately I needed some random numbers with a gaussian (normal) distribution, not evenly distributed as the numbers generated by rand(). After googling a while, I found out that there is no perfect algrorithm that creates such numbers out of evenly distruted random numbers but a few methods that have similar effect. The following function implements all three algorithms I found- The the last two methods create numbers where you can find a lower and upper boundary and the first one will create a number from time to time (such as one in every 10000) that may be very far from the average value. Have fun testing and using it.

function gauss ( $algorithm = «polar» ) <
$randmax = 9999 ;

//polar-methode by marsaglia
case «polar» :
$v = 2 ;
while ( $v > 1 ) <
$u1 = rand ( 0 , $randmax ) / $randmax ;
$u2 = rand ( 0 , $randmax ) / $randmax ;

$v = ( 2 * $u1 — 1 ) * ( 2 * $u1 — 1 ) + ( 2 * $u2 — 1 ) * ( 2 * $u2 — 1 );
>

return ( 2 * $u1 — 1 ) * (( — 2 * log ( $v ) / $v ) ^ 0.5 );

// box-muller-method
case «boxmuller» :
do <
$u1 = rand ( 0 , $randmax ) / $randmax ;
$u2 = rand ( 0 , $randmax ) / $randmax ;

$x = sqrt (- 2 * log ( $u1 )) * cos ( 2 * pi () * $u2 );
> while ( strval ( $x ) == «1.#INF» or strval ( $x ) == «-1.#INF» );

// the check has to be done cause sometimes (1:10000)
// values such as «1.#INF» occur and i dont know why

// twelve random numbers
case «zwoelfer» :
$sum = 0 ;
for ( $i = 0 ; $i 12 ; $i ++) <
$sum += rand ( 0 , $randmax ) / $randmax ;
>
return $sum ;
>
>
?>

frank, nick at nerdynick dot com, and kniht
this is now O(n) instead of O(n^2) ish.

function rand_permute ( $size , $min , $max )
<
$retval = array();
//initialize an array of integers from $min to $max
for( $i = $min ; $i $max ; $i ++)
<
$retval [ $i ] = $i ;
>
//start with the the first index ($min).
//randomly swap this number with any other number in the array.
//this way we guarantee all numbers are permuted in the array,
//and we assure no number is used more than once (technically reiterating prev line).
//therefore we don’t have to do the random checking each time we put something into the array.
for( $i = $min ; $i $size ; $i ++)
<
$tmp = $retval [ $i ];
$retval [ $i ] = $retval [ $tmpkey = rand ( $min , $max )];
$retval [ $tmpkey ] = $tmp ;
>
return array_slice ( $retval , 0 , $size );
>
?>

Here’s an interesting note about the inferiority of the rand() function. Try, for example, the following code.

= array( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
for ( $i = 0 ; $i 1000000 ; $i ++) <
$n = rand ( 0 , 100000 );
if ( $n 10 ) <
$r [ $n ]++;
>
>
print_r ( $r );
?>

which produces something similar to the following output (on my windows box, where RAND_MAX is 32768):

Within this range only multiples of 3 are being selected. Also note that values that are filled are always 30 or 31 (no other values! really!)

Now replace rand() with mt_rand() and see the difference.

Much more randomly distributed!

Conclusion: mt_rand() is not just faster, it is a far superior algorithm.

isn’t this just a simpler way of making a random id for somthing? I mean i know that there is a very slight chance that a duplicate could be made but its a very, very, very small chance, nearly impossible.

$rand = mt_rand(0, 32);
$code = md5($rand . time());
echo «$code»;

and if you don’t want it the md5 can be removed, I’ve just added it as a prefer it there 🙂

emad_ramahi at hotmail dot com:
I’ve actually noticed that with a large dataset (100k rows), the query dramatically slows down the server and performance is way too bad.

The way I see it, you have to workable solutions:

//$Table holds the name of the table we’re getting the random row from
//$Rows specifies how many rows we need to fetch
function mysql_rand ( $Query , $Rows = 1 ) <
//getting the table name from $query
//what you can do, is replace the $query argument with $table,
//this way to dont have to search for the table’s name
$SQL = sprintf ( ‘SELECT COUNT(*) FROM %s’ , substr ( $query , stripos ( $query , ‘from’ )+ 5 , strpos ( $query , ‘ ‘ )));

$Max = mysql_result ( mysql_query ( $SQL ), 0 );
$Random = rand ( 0 , $Max );

//If the random number is 99, and the database only has 100 rows
//We’ll subtract the random number, so we don’t exceed 100, thus preventing a MySQL error message
return $Query . sprintf ( ‘LIMIT %d, %d’ , ( $Max $Rows ) ? 0 : (( $Random > $Max — $Rows ) ? $Max — $Rows : $Random ), $Rows );
>

//Instead of using MySQL’s RAND(), we use LIMIT to fetch rows
//E.g. LIMIT 5,9 fetches from row 5, and the subsequent 9
$SQL = mysql_rand ( ‘SELECT row FROM table’ ); //SELECT row FROM table LIMIT x, y
?>

or SQL:
SELECT * FROM Table T JOIN (SELECT FLOOR(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;

quick way to generate randomish numbers and simple strings.
no messing around with functions, so you can just pop the line into the middle of your existing code.

not the most perfect for sure, but ok for plenty of situations.

= intval ( «0» . rand ( 1 , 9 ) . rand ( 0 , 9 ) . rand ( 0 , 9 ) . rand ( 0 , 9 ) . rand ( 0 , 9 ) ); // random(ish) 5 digit int

$random_string = chr ( rand ( 65 , 90 )) . chr ( rand ( 65 , 90 )) . chr ( rand ( 65 , 90 )) . chr ( rand ( 65 , 90 )) . chr ( rand ( 65 , 90 )); // random(ish) 5 character string

?>

hope someone finds it useful for somthing.

regards,
deeeeeen alxndr0u

Generate a random 5 character alpha string:

print preg_replace ( ‘/([ ])/e’ , ‘chr(rand(97,122))’ , ‘ ‘ );
?>

I also enjoy making one-liners.

Here’s a non-regular expression approach. It generates a random 32 character string consisting of, by default, only A-Z, a-z, and 0-9, but you can change the value of $a for other characters. The random string will be in variable $s after this line.

for ( $s = » , $i = 0 , $z = strlen ( $a = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’ )- 1 ; $i != 32 ; $x = rand ( 0 , $z ), $s .= $a < $x >, $i ++);
?>

If you don’t want the same character to appear beside itself, use this:

for ( $i = 0 , $z = strlen ( $a = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890’ )- 1 , $s = $a < rand ( 0 , $z )>, $i = 1 ; $i != 32 ; $x = rand ( 0 , $z ), $s .= $a < $x >, $s = ( $s < $i >== $s < $i - 1 >? substr ( $s , 0 ,- 1 ) : $s ), $i = strlen ( $s ));
?>

For those of you who want both as a function, use this:

function rand_chars ( $c , $l , $u = FALSE ) <
if (! $u ) for ( $s = » , $i = 0 , $z = strlen ( $c )- 1 ; $i $l ; $x = rand ( 0 , $z ), $s .= $c < $x >, $i ++);
else for ( $i = 0 , $z = strlen ( $c )- 1 , $s = $c < rand ( 0 , $z )>, $i = 1 ; $i != $l ; $x = rand ( 0 , $z ), $s .= $c < $x >, $s = ( $s < $i >== $s < $i - 1 >? substr ( $s , 0 ,- 1 ) : $s ), $i = strlen ( $s ));
return $s ;
>
?>

string $c is the string of characters to use.
integer $l is how long you want the string to be.
boolean $u is whether or not a character can appear beside itself.

Examples:
rand_chars(«ABCEDFG», 10) == GABGFFGCDA
rand_chars(«ABCEDFG», 10, TRUE) == CBGFAEDFEC

Easy way for mysql: random row
the original form is: «. order by rand()»
but this is not the best way, because it’s very slow by a big database (it can take more minutes to complete the request!)
My suggestion:

// estimate the number of rows in a table
$lekerdezes = mysql_query ( «select * from table» );
$max = mysql_num_rows ( $lekerdezes );

// pick one
$rand = rand ( 1 , $max );

$lekerdezes2 = mysql_query ( «select * from table limit $rand, 1» );

// that’s all folks 🙂

As an further optimization on janoserki[at]gmail[dot]com previous post i would recommend that you optimize you first part of php/sql code to something like this.

// estimate the number of rows in a table
$lekerdezes = mysql_query ( «select count(*) as rows from table» );
while ( $row = mysql_fetch_assoc ( $lekerdezes ))
<
$max = $row [ «rows» ];
>
?>
the count(*) is much faster for the database than grabbing the hole dataset from the table.

A nice function to generate a random string, using any character:

function generateRandStr ( $length ) <
$randstr = «» ;
for( $i = 0 ; $i $length ; $i ++) <
$randnum = mt_rand ( 0 , 61 );
if( $randnum 10 ) <
$randstr .= chr ( $randnum + 48 );
>else if( $randnum 36 ) <
$randstr .= chr ( $randnum + 55 );
>else <
$randstr .= chr ( $randnum + 61 );
>
>
return $randstr ;
>
?>

Simply use:
generateRandStr(10);

Sample output: $%29zon(4f

Improved random string generation function:

// Generate a random character string
function rand_str ( $length = 32 , $chars = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890’ )
<
// Length of character list
$chars_length = ( strlen ( $chars ) — 1 );

// Generate random string
for ( $i = 1 ; $i $length ; $i = strlen ( $string ))
<
// Grab a random character from our list
$r = $chars < rand ( 0 , $chars_length )>;

// Make sure the same two characters don’t appear next to each other
if ( $r != $string < $i - 1 >) $string .= $r ;
>

// Return the string
return $string ;
>
?>

To Jano and Peta:

Thanks for the code. In real world usage, I only had one problem with it: It will never return the first result of the array (or it will return nothing if there’s only one item in the array). To remedy this, I simply subtracted 1 from

= rand ( 1 , $max );
?>

like so:

= rand ( 1 , $max )- 1 ;
?>

Thanks though, for the code you supplied. It was exactly what I needed.

I thought this function (random color) might be of use to someone [to create and return a random hex for HTML colors]:

function get_random_color ()
<
for ( $i = 0 ; $i 6 ; $i ++)
<
$c .= dechex ( rand ( 0 , 15 ));
>
return «#$c» ;
>
?>

Here’s a simple function to generate a random date between a start date and an end date.

It is inclusive of BOTH dates — so using dates 2009-04-01 and 2009-04-03 would generate a random date that could be 2009-04-01, 2009-04-02 or 2009-04-03.

It won’t work if the end date is prior to the start date and if you use a non-existant date (eg 2009-02-30) it defaults to 1970-01-01

the longer version:
function makeRandomDateInclusive ( $startDate , $endDate ) <
$days = round (( strtotime ( $endDate ) — strtotime ( $startDate )) / ( 60 * 60 * 24 ));
$n = rand ( 0 , $days );
return date ( «Y-m-d» , strtotime ( «$startDate + $n days» ));
>
?>

and the one-line version for compactness freaks:
function makeRandomDateInclusive ( $startDate , $endDate ) <
return date ( «Y-m-d» , strtotime ( «$startDate + » . rand ( 0 , round (( strtotime ( $endDate ) — strtotime ( $startDate )) / ( 60 * 60 * 24 ))). » days» ));
>
?>

it is called like this
echo makeRandomDateInclusive ( ‘2009-04-01’ , ‘2009-04-03’ );
?>
Hope this is of some use to someone

Another way to create an array of random numbers where there are no identical numbers.

($n = number of random numbers to return in the array
$min = minimum number
$max = maximum number)

function uniqueRand ( $n , $min = 0 , $max = null )
<
if( $max === null )
$max = getrandmax ();
$array = range ( $min , $max );
$return = array();
$keys = array_rand ( $array , $n );
foreach( $keys as $key )
$return [] = $array [ $key ];
return $return ;
>
?>

Generate a random 5 character A-Z0-9 string

for ( $i = 0 ; $i 6 ; $i ++) <
$d = rand ( 1 , 30 )% 2 ;
echo $d ? chr ( rand ( 65 , 90 )) : chr ( rand ( 48 , 57 ));
>
?>

# php -r ‘for ($i=0; $i

//To Pull 7 Unique Random Values Out Of AlphaNumeric

//removed number 0, capital o, number 1 and small L
//Total: keys = 32, elements = 33
$characters = array(
«A» , «B» , «C» , «D» , «E» , «F» , «G» , «H» , «J» , «K» , «L» , «M» ,
«N» , «P» , «Q» , «R» , «S» , «T» , «U» , «V» , «W» , «X» , «Y» , «Z» ,
«1» , «2» , «3» , «4» , «5» , «6» , «7» , «8» , «9» );

//make an «empty container» or array for our keys
$keys = array();

//first count of $keys is empty so «1», remaining count is 1-6 = total 7 times
while( count ( $keys ) 7 ) <
//»0″ because we use this to FIND ARRAY KEYS which has a 0 value
//»-1″ because were only concerned of number of keys which is 32 not 33
//count($characters) = 33
$x = mt_rand ( 0 , count ( $characters )- 1 );
if(! in_array ( $x , $keys )) <
$keys [] = $x ;
>
>

foreach( $keys as $key ) <
$random_chars .= $characters [ $key ];
>
echo $random_chars ;
?>

Random integers with normal distribution,
it’s not scientifically approved, but worked for me.

/*
* @param float $mean, desired average
* @param number $sd, number of items in array
* @param number $min, minimum desired random number
* @param number $max, maximum desired random number
* @return array
*/
function array_distribute ( $mean , $sd , $min , $max ) <
$result = array();
$total_mean = intval ( $mean * $sd );
while( $sd > 1 ) <
$allowed_max = $total_mean — $sd — $min ;
$allowed_min = intval ( $total_mean / $sd );
$random = mt_rand ( max ( $min , $allowed_min ), min ( $max , $allowed_max ));
$result []= $random ;
$sd —;
$total_mean -= $random ;
>
$result [] = $total_mean ;
return $result ;
>
?>

Much easier way to generate random string of numbers and letters:

= rand ( 10e16 , 10e20 );
echo base_convert ( $n , 10 , 36 );
?>

This generates strings of about 11 characters. Experiment with the range for rand() if you want shorter or longer.

Random is NOT actually random.

It is easily illustrated by multiplying rand(1,500) by rand(1,500) and showing the output on the image:

( «Content-type: image/png» );
$img = imagecreatetruecolor ( 500 , 500 );

$ink = imagecolorallocate ( $img , 255 , 255 , 255 );

for( $i = 0 ; $i 500 ; $i ++) <
for( $j = 0 ; $j 500 ; $j ++) <
imagesetpixel ( $img , rand ( 1 , 500 ), rand ( 1 , 500 ), $ink1 );
>
>

imagepng ( $img );
imagedestroy ( $img );

?>

I expected to get pixel noise, but instead one can see plain diagonal lines.

I couldn’t find a suitable random alpha-numeric generator function so I rolled my own. It gives a random number in base 36 (0-9, a-z) to a given length.

function randomAlphaNum ( $length )<

$rangeMin = pow ( 36 , $length — 1 ); //smallest number to give length digits in base 36
$rangeMax = pow ( 36 , $length )- 1 ; //largest number to give length digits in base 36
$base10Rand = mt_rand ( $rangeMin , $rangeMax ); //get the random number
$newRand = base_convert ( $base10Rand , 10 , 36 ); //convert it

return $newRand ; //spit it out

>
?>

hopefully helps someone

I had to create a function that generates a random binominal distributed integer. Take a look at the following Wiki article:

Here is my solution:

function bin_rand ( $min = null , $max = null )
<
$min = ( $min ) ? (int) $min : 0 ;
$max = ( $max ) ? (int) $max : PHP_INT_MAX ;

$range = range ( $min , $max );
$average = array_sum ( $range ) / count ( $range );


$dist = array();
for ( $x = $min ; $x $max ; $x ++) <
$dist [ $x ] = — abs ( $average — $x ) + $average + 1 ;
>

$map = array();
foreach ( $dist as $int => $quantity ) <
for ( $x = 0 ; $x $quantity ; $x ++) <
$map [] = $int ;
>
>

shuffle ( $map );
return current ( $map );
>

Since many people (myself included) come to this page looking for a way to do a random string, I present a way that uses arrays and shuffle() instead of rand(). This also has the effect of not repeating any characters in the value set.

$arr = str_split(‘ABCDEFGHIJKLMNOP’); // get all the characters into an array
shuffle($arr); // randomize the array
$arr = array_slice($arr, 0, 6); // get the first six (random) characters out
$str = implode(», $arr); // smush them back into a string

The Windows rand() function is quite a lot worse than merely having a low maximum value. It’s an ordinary Linear Congruential Generator, which means you only need three consecutive values to be able to predict its entire future output.

Given the numbers 13050, 4267, 25352, construct the equations
4267 = (13050a+c) % 32768
25352 = (4267a+c) % 32768

Solving for a and c gives

a = 20077
c = 12345

Which means the next number that should be spat out is (25352×20077+12345) % 32768 = 19105 — which indeed it is.

It’s not the small rand_max that breaks the algorithm, it’s a weakness in the LCG algorithm itself. It’s designed for when you only want a few kinda-random numbers occasionally, not if you want to generate any random-looking data.

If you are looking for generate a random expression, like password with alphanumeric or any other character, use this function:

function GeraHash ( $qtd ) <
//Under the string $Caracteres you write all the characters you want to be used to randomly generate the code.
$Caracteres = ‘ABCDEFGHIJKLMOPQRSTUVXWYZ0123456789’ ;
$QuantidadeCaracteres = strlen ( $Caracteres );
$QuantidadeCaracteres —;

$Hash = NULL ;
for( $x = 1 ; $x $qtd ; $x ++) <
$Posicao = rand ( 0 , $QuantidadeCaracteres );
$Hash .= substr ( $Caracteres , $Posicao , 1 );
>

//Here you specify how many characters the returning string must have
echo GeraHash ( 30 );
?>

Something we discovered in Sydney running BBS Systems before the net advent was here, if we didn’t seed of another BBS we would going in circles in our System Physicality Abstraction Layers.. The important thing is to seed from a remote system and easy way at the Centroidal Plexus of the web (Chronolabs Cooperative) we offer a seed feed and the following code will randomise you out of the number cycle:

See in PHP both the letters and numbers are seedable as letters are treated as numbers as well. You can always use individual tokens by extracting the Element with DOM.. But below is equally effective!

I agree with Sebmil (function.array-rand#105265) that «array_rand()» produces weird and very uneven random distribution (as of my local PHP 5.3.8 and my public host’s PHP 5.2.17).
Unfortunately, I haven’t got any access either to a server with the latest PHP version. My info is for those of you who like to check things for themselves and who don’t believe all of the official statements in the docs.
I’ve made a simple adjustment of his test code like this:
= 1 ; // Start value
$c = 50 ; // Count / End value
$test = array_fill ( $s , $c , 0 );
$ts = microtime ( true );
for( $i = 0 ; $i 5000000 ; $i ++) <
$idx = mt_rand ( $s , $c ); // Try it with rand() — simpler but more evenly distributed than mt_rand()
$test [ $idx ]++;
>
$te = microtime ( true );
$te =( $te — $ts )* 1000.0 ; // Loop time in miliseconds

asort ( $test );
echo «Test mt_rand() in » . $te . » ms:
\n» ;
foreach( $test as $k => $v ) echo «$k :\t$v
\n» ;
?>

And it appears to me that simple «$ .
And what’s more the simpler and a bit slower (0 ms up to total 712.357 ms at 5 mln cycles) «rand()» is better than «mt_rand()» in simple everyday use cases because it is more evenly distributed (difference least vs. most often numbers: ca. 0.20-1.28 % for «rand()» vs. ca. 1.43-1.68 % for «mt_rand()»).
Try it for yourself. although it depends on your software and hardware configuration, range of numbers to choose from (due to random patterns), number of cycles in the loop, and temporary (public) server load as well.

From PHP 7.1 rand() is documented as an alias of mt_rand().

Actually, if they are called with two arguments where the second is smaller than the first, their output differs.

Warning: mt_rand(): max(1) is smaller than min(2)
int(2)
bool(false)

where rand() will return a random value between $max and $min

I wrote this many years back and just found it. thought I share. what it does is generate either random numbers 0-9, Alphabets A-Z or Alphanumeric which is a combination of numbers and alphabets. I turned it into a class before sharing. do with it what you please. Solved some of my problems.

class Random <
public static function Numeric ( $length )
<
$chars = «1234567890» ;
$clen = strlen ( $chars )- 1 ;
$id = » ;

for ( $i = 0 ; $i $length ; $i ++) <
$id .= $chars [ mt_rand ( 0 , $clen )];
>
return ( $id );
>

public static function Alphabets ( $length )
<
$chars = «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz» ;
$clen = strlen ( $chars )- 1 ;
$id = » ;

for ( $i = 0 ; $i $length ; $i ++) <
$id .= $chars [ mt_rand ( 0 , $clen )];
>
return ( $id );
>

public static function AlphaNumeric ( $length )
<
$chars = «1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz» ;
$clen = strlen ( $chars )- 1 ;
$id = » ;

for ( $i = 0 ; $i $length ; $i ++) <
$id .= $chars [ mt_rand ( 0 , $clen )];
>
return ( $id );
>
>

echo Random :: Numeric ( 6 ); # eg result: «567268»
echo Random :: Alphabets ( 9 ); # eg result: IAGRmZyJS
echo Random :: AlphaNumeric ( 10 ); #eg result: Gzt6syUS8M

this is my vision about «custom random string» :

function s ( $length ) <
for( $i = 0 ;( $i $length )and(( $what = rand ( 1 , 3 ))and( (( $what == 1 )and( $t = rand ( 48 , 57 ) ))or (( $what == 2 )and ( $t = rand ( 65 , 90 ))) or (( $what == 3 )and ( $t = rand ( 97 , 122 ))) ) and (print chr ( $t ))); $i ++);
>
s ( 10 );

Разница между mt_rand () и rand ()

В чем разница между использованием mt_rand($min, $max) и rand($min, $max) относительно скорости?

Обновить

Поскольку PHP 7.1 mt_rand полностью заменил rand , и rand был сделан псевдоним для mt_rand . В ответе ниже рассматриваются различия между двумя функциями для более старых версий и причины введения mt_rand .

Скорость не была причиной появления mt_rand !

Функция rand существовала до mt_rand , но она была глубоко ошибочной. PRNG должен получить некоторую энтропию, число, из которого оно генерирует последовательность случайных чисел. Если вы распечатаете список из десяти чисел, которые были созданы rand() например:

Вывод может использоваться для определения того, что такое семя rand , и с его помощью вы можете предсказать следующие случайные числа. Есть инструменты, которые делают это, поэтому google немного и протестируйте его.

Есть также проблема с rand релятививно быстро показывает шаблоны в своих случайных числах, как показано здесь . Проблема mt_rand похоже, тоже намного лучше.

mt_rand использует лучший алгоритм рандомизации (Mersenne Twist), который требует большего количества случайных чисел до того, как семя может быть определено и быстрее. Это не означает, что mt_rand по определению быстрее, чем rand , это означает, что способ генерации чисел быстрее и, по-видимому, не оказывает реального влияния на производительность функции, как показали другие ответы.
В любом случае, посмотрите на mt_srand и srand docs . Я уверен, что они будут содержать дополнительную информацию

Если алгоритм mt_rand переводится с увеличением производительности, то это здорово для вас, но это счастливое совпадение. TL; TR:

mt_rand был введен для устранения проблем, существующих в rand !

Обновление (PHP 7.1):

rand() и srand() теперь были сделаны aliases для mt_rand() и mt_srand() соответственно. Это означает, что выходные данные для следующих функций имеют изменения: rand() , shuffle() , str_shuffle() и array_rand() .

Это означает, что с версии 7.1 нет никакой практической разницы между обоими из них, потому что rand вызывает mt_rand внутренне .

Перед PHP 7.1:

Использование rand() не является плохой практикой, если оно не используется для целей безопасности, я обычно использую rand() (привычка?).

Если вам нужно огромное количество случайных чисел, вам понадобится mt_rand вместо rand . mt_rand имеет период 2 19937 – 1, намного лучше, чем rand (2 32 ). Взгляните на эту статью о генерации графического шаблона с использованием rand и mt_rand .

Периодичность и энтропия – единственные причины использования mt_rand() вместо rand() а не улучшения безопасности или скорости.

Математически mt_rand имеют большую энтропию и большую периодичность, чем rand (2 19937 -1 против 2 32 ).

Если вам нужны несколько случайных чисел, а безопасность не проблема, rand выполнит эту работу (получите случайное число, чтобы решить, как запустить процесс очистки).

Улучшение скорости тестирования

На практике нет большой разницы в скорости между двумя функциями (возможно, потому, что накладные расходы на PHP⇔C?).

Код проверки PHP:

Тесты в PHP 7.0.19:

Тесты в PHP 5.4.45 (медленная машина):

Только 6-9%, а не 400%.

Использование в целях безопасности

Но если вашему приложению требуется много энтропии, потому что проблемы безопасности, вам понадобится более безопасный способ, и openssl_random_pseudo_bytes() возможно, является лучшим решением, делает свою работу (гораздо лучше, но медленнее? Нам нужна безопасность по скорости?), Полагаясь на openssl связанных с этим .

Ни rand() ни mt_rand() являются достаточно безопасными :

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

Существуют расширения PHP, такие как random_compat , но я не рекомендовал их использовать, если это не нужно.

Руководство PHP по mt_rand() сообщает, что оно:

который будет генерировать случайные числа в четыре раза быстрее, чем среднее значение libc rand ().

Начиная с PHP 7.1 нет никакой разницы . rand () теперь является псевдонимом для mt_rand ().

Ниже приведена разница в скорости для обоих из них: –
mt_rand($min, $max) в четыре раза быстрее по сравнению с rand($min, $max)

Причина в том, что rand($min, $max) использует генератор случайных чисел libc, а mt_rand($min, $max) использует Mersenne Twister, что в четыре раза быстрее.

Надеюсь, это решит ваши сомнения.
Благодарю.

Они кажутся равными по скорости:

Результаты для OSX Mavericks и VirtualBox’ed Ubuntu 11:

Если эти меры верны, комментарий к руководству, упомянутый в другом месте, должен считаться ошибочным / устаревшим.

wp_rand() WP 2.6.2

Генерирует случайное число между указанных min и max.

C версии 4.4.0 использует PHP7 random_int(), если доступна; или внутренний алгортитм.

Это pluggable функция — т.е. её можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена. Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Возвращает

Число. Созданное число.

Использование

Примеры

#1 Получим случайное число

Демонстрация работы функции:

Заметки

  • Global. Строка. $rnd_value
  • Static. Строка. $seed
  • Static. true/false. $use_random_int_functionality

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

С версии 2.6.2 Введена.
С версии 4.4.0 Uses PHP7 random_int() or the random_compat library if available.

Код wp rand : wp-includes/pluggable.php WP 5.2.4

Cвязанные функции

Из метки: Аналоги PHP (замена PHP функций)

Еще из раздела: Вспомогательные

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

Применение функции PHP random

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

Случайность и уникальность

Функция PHP random представлена двумя вариантами: rand() и mt_rand(). Считается, что алгоритм в первом случае более прост и генерирует псевдослучайные числа. Второй вариант имеет более быстрый алгоритм и известные математические характеристики. В большинстве случаев, когда нужно получить случайное число, можно использовать серию вызовов PHP random и получить уникальную комбинацию цифр.

Если взять за основу цифры от 1 до 26 или от 1 до 32 и получать их случайным образом, то можно сформировать ключевую информацию как последовательность букв латиницы или кириллицы. В этом случае PHP random — это способ формирования последовательности алфавитной информации, например, для целей тестирования каналов связи или алгоритмов.

Случайное число редко бывает уникальным, поскольку оно может появляться многократно согласно закону распределения случайной величины. Но если совместить, в частности, статическую переменную PHP & Math.random языка JavaScript, то можно получить реальное уникальное случайное число, которое не будет повторяться во времени.

Использование функции времени

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

Применяя PHP random в диапазоне секунд или миллисекунд при большом диапазоне возможных значений, можно получить уникальные случайные комбинации цифр или букв. Что еще?

Сочетая значение функции времени, последовательно растущее число и PHP random или JavaScript Math.random, можно обеспечить надежную безопасность каналов связи клиента и сервера, создать уникальные коды для переменных, сформировать непредсказуемые события в алгоритмах.

Генератор случайных чисел PHP — отличное решение для большинства задач, особенно когда нужно быстро получить качественный результат с минимальными затратами. Использование функций rand() и mt_rand в совокупности с последовательно растущими рядами чисел или значениями времени позволяет получить случайные числа как повторяющиеся по значениям, так и уникальные.

Топ-пост этого месяца:  Урок 2. Паттерны проектирования. Multitone. Статическая фабрика
Добавить комментарий