Подтвердить что ты не робот

Лучшее случайное генерирование PHP

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

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

Я использовал это, чтобы сделать небольшой тест:

$i = 0;

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

RANDOM.ORG - это истинная служба случайных чисел, которая генерирует случайность через атмосферный шум.

Ответ 3

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

Есть хорошие статьи о случайности в Fourmilab, в том числе еще истинный случайный генератор. Может быть, вы можете получить случайные данные с обоих сайтов, поэтому, если у вас все еще есть другие.

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

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

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

Ответ 4

Изменение на @KG, используя миллисекунды с EPOCH в качестве семени для rand?

Ответ 5

Другой способ получить случайные числа, похожие по идее на получение UUID

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

openssl_random_pseudo_bytes(...)

Или вы можете попробовать следующую library с помощью RFC4122

Ответ 6

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

int random_int ( int $min , int $max )

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

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