3.10 Случайные числа

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

Псевдослучайные числа генерируются из начального значения (seed). Начиная с любого заданного начального значения, функция random всегда генерирует одну и ту же последовательность чисел. По умолчанию Emacs инициализирует начальное значение случайности при запуске таким образом, что последовательность значений random (с очень высокой вероятностью) отличается при каждом запуске Emacs. Начальное значение случайности обычно инициализируется из системной энтропии; однако на устаревших платформах, не имеющих пулов энтропии, начальное значение берется из менее случайных летучих данных, таких как текущее время.

Иногда вы хотите, чтобы последовательность случайных чисел была воспроизводимой. Например, при отладке программы, поведение которой зависит от последовательности случайных чисел, полезно получить одинаковое поведение при каждом запуске программы. Чтобы сделать последовательность воспроизводимой, выполните (random ""). Это устанавливает начальное значение в константное для вашего конкретного исполняемого файла Emacs (хотя оно может отличаться для других сборок Emacs). Вы можете использовать другие строки для выбора различных начальных значений.

Функция: random &optional limit

Эта функция возвращает псевдослучайное целое число. Повторные вызовы возвращают серию псевдослучайных целых чисел.

Если limit является положительным целым числом, значение выбирается таким образом, чтобы оно было неотрицательным и меньше limit. В противном случае значение может быть любым fixnum, то есть любым целым числом от most-negative-fixnum до most-positive-fixnum (см. Основы целых чисел).

Если limit является строкой, это означает выбор нового начального значения на основе содержимого этой строки. Это заставляет последующие вызовы random возвращать воспроизводимую последовательность результатов.

Если limit равно t, это означает выбор нового начального значения так, как если бы Emacs перезапускался. Это заставляет последующие вызовы random возвращать непредсказуемую последовательность результатов.

Если вам нужен случайный nonce для криптографических целей, использование random обычно не является лучшим подходом по нескольким причинам: