Я знаю, что использование rand() предсказуемо, если вы знаете, что делаете, и имеете доступ к серверу.
У меня есть проект, в котором высоко зависит от выбора случайного числа, которое является настолько непредсказуемым, насколько это возможно. Поэтому я ищу предложения, будь то другие встроенные функции или пользовательские функции, которые могут генерировать случайное число лучше.
Я использовал это для небольшого теста:
$i = 0;
while($i < 10000){
$rand = rand(0, 100);
if (!isset($array[$rand])){
$array[$rand] = 1;
} else {
$array[$rand]++;
}
sort($array);
$i++;
}
Я обнаружил, что результаты распределяются равномерно, и существует нечетная закономерность в отношении того, сколько раз генерируется каждое число.






Вариация @KG с использованием миллисекунд с момента EPOCH в качестве начального числа для rand?
Ооооо, с сегодняшними быстрыми многоядерными компьютерами у вас есть довольно хорошие шансы повторно использовать сид несколько раз? Огромный красный флаг - вы изобретаете квадратное колесо заново, даже srand() без аргументов работает лучше («более случайным»).
Добавление, умножение или усечение плохого случайного источника даст вам плохой случайный результат. См. Объяснение в Введение в случайность и случайные числа.
Вы правы насчет функции 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 (и их различиях), а также о том, почему ваш исходный подход на самом деле является плохой идеей, прочтите мой еще один очень похожий ответ.
В php7 появилась новая функция делает именно то, что вам нужно.