Лучшая случайная генерация PHP

Я знаю, что использование rand() предсказуемо, если вы знаете, что делаете, и имеете доступ к серверу.

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

Я использовал это для небольшого теста:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if (!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

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

В php7 появилась новая функция делает именно то, что вам нужно.

Salvador Dali 16.07.2015 06:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
1
7 168
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вариация @KG с использованием миллисекунд с момента EPOCH в качестве начального числа для rand?

Ооооо, с сегодняшними быстрыми многоядерными компьютерами у вас есть довольно хорошие шансы повторно использовать сид несколько раз? Огромный красный флаг - вы изобретаете квадратное колесо заново, даже srand() без аргументов работает лучше («более случайным»).

Piskvor left the building 18.06.2012 21:59
Ответ принят как подходящий

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

Вы правы насчет функции PHP rand (). См. Второй рисунок на Статистический анализ для наглядной иллюстрации. (Первая цифра поразительна, но она нарисована Скоттом Адамсом, а не с помощью rand ()).

Одно из решений - использовать настоящий случайный генератор, такой как random.org. Другой, если вы используете Linux / BSD / и т. д. использовать / dev / случайный. Если случайность критически важна, вам придется использовать аппаратный генератор случайных чисел.

random.org имеет API, к которому вы можете получить доступ через HTTP.

RANDOM.ORG is a true random number service that generates randomness via atmospheric noise.

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

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

Fourmilab также предоставляет программа испытаний для проверки случайности. Вы можете использовать его для проверки различных программ myRand ().

Что касается вашей последней программы, если вы генерируете 10000 значений, почему бы вам не выбрать окончательное значение среди 10 тысяч? Вы ограничиваете себя подмножеством. Кроме того, это не сработает, если ваши $ min и $ max больше 10000.

В любом случае, необходимая вам случайность зависит от вашего приложения. rand () подойдет для онлайн-игры, но не подходит для криптографии (все, что не было тщательно проверено статистическими программами, в любом случае не подойдет для криптографии). Ты будешь судьей!

Другой способ получения случайных чисел, похожий по концепции на получение UUID

Версия PHP 5.3 и выше

openssl_random_pseudo_bytes(...)

Или вы можете попробовать следующий библиотека, используя RFC4122

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

int random_int ( int $min , int $max )

Generates cryptographic random integers that are suitable for use where unbiased results are critical (i.e. shuffling a Poker deck).

Для более подробного объяснения о PRNG и CSPRNG (и их различиях), а также о том, почему ваш исходный подход на самом деле является плохой идеей, прочтите мой еще один очень похожий ответ.

Другие вопросы по теме