Ответ 1
(Примечание. Обычно речь идет о случайных [и псевдослучайных] числах в вычислениях и их использовании.)
Вы не можете иметь настоящие случайные числа с детерминированным процессом, поэтому компьютеры довольно плохо приспособлены для их генерации (поскольку ЦП может переворачивать биты только детерминированным образом). В большинстве языков, сред и библиотек используются так называемые генераторы псевдослучайных чисел (PRNG). Они берут начальное число, являющееся своего рода вектором начального состояния, которое может быть одним числом или массивом чисел, и генерируют оттуда последовательность, казалось бы, случайных значений. Результаты обычно удовлетворяют определенным статистическим показателям, но не являются полностью случайными, поскольку одно и то же начальное число даст одинаковую последовательность.
Одним из самых простых PRNG является так называемый линейный конгруэнтный генератор (LCG). Он просто имеет одно число в качестве состояния (которое изначально является семенем). Затем для каждого последующего возвращаемого значения формула повторяется следующим образом:
где a, b и c - постоянные для генератора. c обычно является степенью двойки, такой как 2 32 просто потому, что его легко реализовать (выполняется автоматически) и быстро. Однако найти хорошие значения для a и b сложно. В качестве наиболее тривиального примера, когда вы используете a = 2 и b = 0, вы можете видеть, что результирующие значения никогда не могут быть нечетными. Это ограничивает диапазон значений, которые генератор может выдавать довольно строго. Как правило, LCG - это очень старая концепция, которая давно вытесняется гораздо лучшими генераторами, поэтому не используйте их, за исключением крайне ограниченных сред (хотя обычно даже встроенные системы могут работать с лучшими генераторами без проблем) - MT19937 или его обобщение, генераторы WELL обычно намного лучше для людей, которые просто не хотят беспокоиться о свойствах своих псевдослучайных чисел.
Одним из основных приложений PRNG является моделирование. Поскольку PRNG могут дать оценку или гарантию статистических свойств, и эксперимент может быть повторен точно из-за природы семян, они делают это хорошо здесь. Представьте, что вы публикуете статью и хотите, чтобы другие люди копировали ваши результаты. С аппаратным RNG (см. ниже) у вас нет другого выбора, кроме как включить каждое случайное число, которое вы использовали. Для моделирования Монте-Карло, которое может легко использовать несколько миллиардов чисел или больше, это... не совсем возможно.
Затем существуют генераторы случайных чисел для криптографических приложений, например, для защиты вашего соединения SSL. Примерами здесь являются Windows CryptGenRandom или Unix /dev/urandom
. Они часто также являются PRNG, однако для посева используют так называемый "пул энтропии", который содержит непредсказуемые значения. Главное здесь - генерировать непредсказуемые последовательности, даже если одно и то же начальное число все равно даст ту же последовательность. Чтобы минимизировать эффект угадывания последовательности атакующего, его нужно регулярно пересевать. Энтропийный пул собирается из различных точек системы: таких событий, как ввод, сетевая активность и т.д. Иногда он также инициализируется с помощью областей памяти во всей системе, которые, как предполагается, содержат мусор. Однако, если это будет сделано, необходимо позаботиться о том, чтобы пул энтропии действительно содержал непредсказуемые данные. То, что Debian ошибся в OpenSSL несколько лет назад.
Вы также можете использовать пул энтропии напрямую для получения случайных чисел (например, Linux /dev/random
; вместо этого FreeBSD использует тот же алгоритм для /dev/random
, что и для /dev/urandom
), но вы не получаете слишком много из этого, и как только он опустеет, потребуется время, чтобы пополнить. Вот почему упомянутые выше алгоритмы обычно используются, чтобы распространить небольшую энтропию на большие объемы.
Кроме того, существуют аппаратные генераторы случайных чисел, которые используют непредсказуемые естественные процессы, такие как радиоактивный распад или электрические помехи в проводе. Они предназначены для самых требовательных приложений, требующих большого количества "по-настоящему" случайных чисел, и способны генерировать несколько сотен мегабайт случайности в секунду, обычно (хорошо, этой точке данных несколько лет, но я сомневаюсь, что это можно сделать намного быстрее сейчас).
Вы можете эмулировать такие вещи, написав программу, снимающую изображения с веб-камеры с включенной крышкой объектива (тогда остается только шум) или с аудиовхода, когда фактический вход отсутствует. Это хорошо для небольшого взлома, но обычно не будет генерировать хорошие случайные числа, так как они смещены, то есть в нулях битового потока, а единицы не представлены с одинаковой частотой (или, в дальнейшем, последовательности 00
, 01
, 10
и 11
не генерируются с одинаковой частотой... вы можете сделать это и для больших последовательностей). Таким образом, часть фактического аппаратного RNG позволяет убедиться, что полученные значения удовлетворяют определенным статистическим свойствам распределения.
Некоторые люди на самом деле бросают кости, чтобы получить случайные броски костей, или даже принимают это за повышенную передачу. И люди делают очень плохие генераторы случайных чисел.