Главное меню

Новости:

SMF - Just Installed!

Насколько рандомный рандом в языке PHP?

Автор Eneta, Март 14, 2024, 20:24

« назад - далее »

Eneta

Взять набор цифр от 0 до 9. И за каждый ход выбираем одну случайно с помощью встроенного в PHP генератора случайных чисел.
Сделаем большое число попыток (10,000), затем сложим результаты всех чётных попыток и всех нечётных.
С какой вероятностью разница сумм будет отличаться более 5% от суммы?

Rausbl

Навряд ли кто здесь будет заниматься подсчётом попыток чётных и нечётных :)
Сделайте это сами и поделитесь с нами результатами.
В PHP используется не одна, а три функции генератора случайных чисел, использующих различные алгоритмы рандомизации: rand(), mt_rand() и random_int(). Поэтому ваша задача для каждого из них будет иметь разные ответы.
Важно понимать, что ни одно событие не является случайным. Даже бросок монеты можно рассчитать, зная исходное положение монеты, силу броска, вес монеты, скорость ветра, силу гравитации...
Поэтому все случайные числа генератора случайных чисел на самом деле не случайные, а "псевдослучайные", рассчитанные по определённым алгоритмам, основная задача которых генерировать числа, которые не следуют шаблону и не могут быть предсказаны.
Функция rand() - самая простая и использует генератор случайных чисел GLib. В ней легко вычислить алгоритм генерации и предсказать следующие случайные числа. Поэтому, в PHP7.1 mt_rand полностью заменил rand , и rand стал псевдонимом для mt_rand.
mt_rand() использует более быстрый и лучший алгоритм рандомизации Mersenne Twister.
В PHP7 также появилась новая функция генератора криптографически безопасных случайных целых чисел random_int().
Источник случайных величин используемых данной функцией:
В Windows всегда используется CryptGenRandom().
В Linux, если доступен, используется системный вызов getrandom(2).
На других платформах используется /dev/urandom.
Если доступные источники случайных величин отсутствуют, то бросается исключение Exception.