Случайные числа
Детерминированная компьютерная программа не может генерировать истинно случайные числа. Для большинства задач достаточно псевдослучайных чисел. Последовательность псевдослучайных чисел генерируется детерминированным способом. Эти числа не являются истинно случайными, но обладают некоторыми свойствами, имитирующими случайную последовательность. Например, все возможные значения встречаются в псевдослучайной последовательности одинаково часто.
Псевдослучайные числа генерируются на основе начального значения. Начиная с любого заданного начального значения, функция 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 по нескольким причинам:
- Хотя с помощью
(random t)можно обратиться к системной энтропии, это может негативно повлиять на другие части программы, которым полезны воспроизводимые результаты. - Системно-зависимый генератор псевдослучайных чисел (PRNG), используемый
random, не обязательно подходит для криптографии. - Вызов
(random t)не обеспечивает прямой доступ к системной энтропии: энтропия проходит через системно-зависимый генератор псевдослучайных чисел, что может привести к смещению результатов. - На типичных платформах начальное значение генератора случайных чисел содержит всего 32 бита, что обычно меньше разрядности fixnum в Emacs и совершенно недостаточно для криптографических целей.
- Вызов
(random t)оставляет сведения об одноразовом параметре в разных частях внутреннего состояния Emacs, увеличивая площадь возможной атаки. - На устаревших платформах без пулов энтропии
(random t)инициализируется криптографически ненадёжным источником.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Random-Numbers.html