«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2022/05/09 09:37:17  №2353121 1
Что лучше random_int или mt_rand?
Ответы: >>2355316
Аноним 2022/05/12 14:45:41  №2355316 2
>>2353121

mt_rand это генератор, основанный на последовательности чисел. Есть очень-очень длинная последовательность чисел, и генератор каждый раз берет из нее следующее число. Если он доходит до конца последовательности, то он возвращается в ее начало.

То есть, там есть формула, по которой из предыдущего числа получается следующее. И он каждый раз применяет эту формулу.

Приведу упрощенный пример, как можно генерировать псевдослучайные числа (mt_rand устроен во много раз сложнее, я же специально упростил логику для понимания). Пусть у нас формула для генерации следующего числа (y) из предыдущего (x) такая:

y = (11 * x + 7) % 10

%10 значит "остаток от деления числа на 10", то есть, последняя цифра из числа.

Если мы возьмем начальное значение x = 1 и подставим в формулу, то получим новое случайное число y = (11 * 1 + 7) % 10 = 18 % 10 = 8. Если мы подставим в формулу 8, то получим 5. И так далее.

Последовательность чисел, которые сгенерирует генератор, состоит из 10 цифр и выглядит так:

1 8 5 2 9 6 3 0 7 4 1 8 5 2 9 ....

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

(если тебе интересно, откуда я знаю эту формулу и числа в ней, то читай википедию: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 )

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

Для генератора выше, если ты получил числа 8 и 5, то ты знаешь, что дальше он выдаст число 2.

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

Вот еще пример, где нельзя использовать такой генератор. Допустим, у тебя на сайте сделан вход через код в СМС. То есть, ты вводишь номер телефона, сайт генерирует случайный код и высылает его в СМС. Злоумышленник, зная, что ты используешь mt_rand(), несколько раз вводит свой номер и получает несколько кодов подряд. Имея эти коды, он рассчитывает, в каком месте последовательности находится генератор и предсказывает, какие следующие коды будут сгенерированы. После этого он вводит номер телефона жертвы и угаданный код, и получает доступ к его аккаунту.

То есть, mt_rand подходит для ситуаций, где не критично, если кто-то угадает числа.

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

Если тебе нужно генерировать много криптографически надежных чисел с большой скоростью, то придется раскошелиться на аппаратный генератор случайных чисел. Или использовать современный процессор, в который такие генератор часто встроен (если ты конечно доверяешь Intel или AMD и веришь, что американское правительство не встроило закладки в этот генератор, чтобы обчистить твое казино, прочитать твои сообщения и взломать СМС-коды на твоем сайте).