(Примечание: я игнорирую использование слова «компилятор» в вашем вопросе, так как оно на самом деле ничего не значит. Вместо этого обычно речь идет о случайных [и псевдослучайных] числах в вычислениях иих использование.)
Вы не можете иметь настоящие случайные числа с детерминированным процессом, поэтому компьютеры довольно плохо приспособлены для их генерации (поскольку ЦП может переворачивать биты только детерминированным образом),В большинстве языков, сред и библиотек используются так называемые генераторы псевдо случайных чисел (PRNG).Они берут seed , который является своего рода вектором начального состояния, который может быть одним числом или массивом чисел, и генерирует последовательность кажущихся случайными значений оттуда.Результаты обычно удовлетворяют определенным статистическим показателям, но не являются полностью случайными, поскольку одно и то же начальное число даст точно такую же последовательность.
Одним из самых простых PRNG является так называемый линейный конгруэнтный генератор (LCG).Он просто имеет одно число в качестве состояния (которое изначально является семенем).Затем для каждого последующего возвращаемого значения формула выглядит примерно так:
формула LCG: x_ (n + 1) = a⋅x_n + b (modc) http://hypftier.de/dump/SO-6593636-lcg.png
где 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 несколько лет назад.
Вы можете всепоэтому используйте пул энтропии напрямую для получения случайных чисел (например, /dev/random
в Linux; вместо этого FreeBSD использует тот же алгоритм для /dev/random
, что и для /dev/urandom
), но вы не получите слишком много из этого и как только он опустеет, требуется время, чтобы пополнить. Вот почему упомянутые выше алгоритмы обычно используются, чтобы распространить небольшую энтропию на большие объемы.
Затем существуют аппаратные генераторы случайных чисел, в которых используются непредсказуемые естественные процессы, такие как радиоактивный распад или электрические помехи в проводе. Они предназначены для самых требовательных приложений, требующих большого количества «по-настоящему» случайных чисел, и способны генерировать несколько сотен мегабайт случайности в секунду, обычно (хорошо, этой точке данных несколько лет, но я сомневаюсь, что это можно сделать намного быстрее))
Вы можете эмулировать такие вещи, написав программу, снимающую изображения с веб-камеры с включенной крышкой объектива (тогда остается только шум), или с аудиовхода, когда фактический вход отсутствует. Это хорошо для небольшого взлома, но обычно не генерирует хороших случайных чисел, так как они смещены, т. Е. В нулевом потоке битов и единицы не представлены с одинаковой частотой (или, далее, последовательности 00
, 01
, 10
и 11
не генерируются с одинаковой частотой ... это можно сделать и для больших последовательностей). Таким образом, часть фактического аппаратного RNG позволяет убедиться, что полученные значения удовлетворяют определенным статистическим свойствам распределения.
Некоторые люди на самом деле бросают кости, чтобы получить случайные броски костей или даже принимают это в овердрайв . И люди делают очень плохие генераторы случайных чисел .