PHP rand()
, как и все генераторы псевдослучайных чисел , не генерирует действительно случайные данные, а вместо этого использует некоторую математическую функцию для создания, казалось бы, случайных данных.
Методы могут различаться, но основной принцип таков:
Мы принимаем начальное значение в качестве «семени», s
.(Это может быть текущее время, введенное пользователем «случайное» значение или даже истинная случайная энтропия, полученная из некоторого источника энтропии )
Затем мы берем s
и применяем функцию,f
, чтобы получить новое значение s'
(s-штрих) (эта функция часто является функцией по модулю или функцией хеширования)
Затем мы можем повторить этот процесс до бесконечности, добавляя s'
в f
, получая s''
и т. д.
Эта последовательность результатов из f
является нашими "случайными" числами.
Но, надеюсь, вы поняли, f
остался прежним и всегда будет выдавать один и тот же вывод при одном и том же вводе.
Так что, если мы дадим ему одинаковое начальное начальное число s
, мы всегда получим одинаковую последовательность s'
, s''
, s'''
...
Вот почему мы называем их "Псуедо" случайными.Если вы не знаете начальное семя и не наблюдаете последовательность слишком долго, это кажется случайным.Но если мы знаем используемую функцию f
и начальное начальное число s
, мы можем предсказать, какое значение получит rand()
.