Детерминированная компьютерная программа не может сгенерировать истинно случайные числа. Для большинства целей достаточно псевдослучайных чисел. Последовательность псевдослучайных чисел генерируется детерминированным способом. Эти числа не являются истинно случайными, но они обладают определенными свойствами, имитирующими случайную серию. Например, все возможные значения встречаются с одинаковой частотой в псевдослучайной серии.
Псевдослучайные числа генерируются из начального значения (seed).
Начиная с любого заданного начального значения, функция random
всегда генерирует одну и ту же последовательность чисел. По умолчанию Emacs
инициализирует начальное значение случайности при запуске таким образом, что
последовательность значений random (с очень высокой вероятностью)
отличается при каждом запуске Emacs.
Начальное значение случайности обычно инициализируется из системной энтропии;
однако на устаревших платформах, не имеющих пулов энтропии, начальное
значение берется из менее случайных летучих данных, таких как текущее время.
Иногда вы хотите, чтобы последовательность случайных чисел была воспроизводимой.
Например, при отладке программы, поведение которой зависит от последовательности
случайных чисел, полезно получить одинаковое поведение при каждом запуске
программы. Чтобы сделать последовательность воспроизводимой, выполните
(random "").
Это устанавливает начальное значение в константное для вашего конкретного
исполняемого файла Emacs (хотя оно может отличаться для других сборок Emacs).
Вы можете использовать другие строки для выбора различных начальных значений.
Эта функция возвращает псевдослучайное целое число. Повторные вызовы возвращают серию псевдослучайных целых чисел.
Если limit является положительным целым числом, значение
выбирается таким образом, чтобы оно было неотрицательным и меньше limit.
В противном случае значение может быть любым fixnum, то есть любым целым числом
от most-negative-fixnum до most-positive-fixnum (см.
Основы целых чисел).
Если limit является строкой, это означает выбор нового
начального значения на основе содержимого этой строки. Это заставляет последующие
вызовы random возвращать воспроизводимую последовательность
результатов.
Если limit равно t, это означает выбор нового
начального значения так, как если бы Emacs перезапускался. Это заставляет
последующие вызовы random возвращать непредсказуемую
последовательность результатов.
Если вам нужен случайный nonce для криптографических целей, использование
random обычно не является лучшим подходом по нескольким причинам:
(random t) для обращения к
системной энтропии, это может негативно сказаться на других частях вашей
программы, которые выигрывают от воспроизводимых результатов.
random, не обязательно подходит для криптографии.
(random t) не дает прямого доступа к
системной энтропии; энтропия передается через PRNG, зависящий от системы,
тем самым потенциально смещая результаты.
(random t) оставляет информацию о nonce
рассеянной во внутреннем состоянии Emacs, увеличивая размер внутренней
поверхности атаки.
(random t)
инициализируется из криптографически слабого источника.