Что более случайное: номер, созданный человеком или программным обеспечением?

Может ли бросить монету, чтобы получить случайный бит?
Или выбросить штамп, чтобы получить случайное целое число от 1 до 6?
Или возьмите карту из перетасованной колоды, чтобы получить номер от 1 до 52?
.
.
.
Или он может думать, как мы, или иметь такой же ум, как мы?

Очевидно, что приведенные выше примеры не могут быть способами генерации случайных данных.

Затем, как библиотеки программного обеспечения генерируют числа random в заданном диапазоне? Что более произвольно: сгенерировано человеком или программным обеспечением?

Ответ 1

(Примечание. Обычно речь идет о случайных [и псевдослучайных] числах в вычислениях и их использовании.)

Вы не можете иметь настоящие случайные числа с детерминированным процессом, поэтому компьютеры довольно плохо приспособлены для их генерации (поскольку ЦП может переворачивать биты только детерминированным образом). В большинстве языков, сред и библиотек используются так называемые генераторы псевдослучайных чисел (PRNG). Они берут начальное число, являющееся своего рода вектором начального состояния, которое может быть одним числом или массивом чисел, и генерируют оттуда последовательность, казалось бы, случайных значений. Результаты обычно удовлетворяют определенным статистическим показателям, но не являются полностью случайными, поскольку одно и то же начальное число даст одинаковую последовательность.

Одним из самых простых PRNG является так называемый линейный конгруэнтный генератор (LCG). Он просто имеет одно число в качестве состояния (которое изначально является семенем). Затем для каждого последующего возвращаемого значения формула повторяется следующим образом:

LCG formula: x_(n+1)=a⋅x_n+b (mod⁡c )

где 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 позволяет убедиться, что полученные значения удовлетворяют определенным статистическим свойствам распределения.

Некоторые люди на самом деле бросают кости, чтобы получить случайные броски костей, или даже принимают это за повышенную передачу. И люди делают очень плохие генераторы случайных чисел.

Ответ 2

Компилятор абсолютно ничего не требует от случайного числа. Компилятор просто делает ваш код, вызывает другой код, который возвращает случайное число. Теперь "другой код", который вызывает случайное число, может быть:

  • Реализовано в вашем коде.
  • Реализовано как часть стандартной библиотеки.
  • Реализован как часть специальной библиотеки.

В случаях (1) и (2) это в основном псевдослучайный алгоритм, и числа, которые вы получаете, на самом деле не случайны. Если он является частью стандартной библиотеки (например, cmath или math.h), то нельзя сказать точно, что значения результата являются псевдослучайными, поскольку стандарты определяют только определение, а не реализацию.

EDIT: библиотека является stdlib.h, и она ВСЕГДА представляет собой psuedo-random number, как указано Joey и phresnel. Прочтите комментарии для получения более подробной информации об их ответах. Я прошу прощения за ошибку, и я согласен с тем, что должен был знать лучше, чем отвечать на инстинкт.

Можно использовать специальные библиотеки, которые могут иметь специальную реализацию других алгоритмов, таких как алгоритм Mersenne Twister. Кроме того, они могут быть не чем иным, как драйверами оборудования, которые могут генерировать случайные числа. Аппаратные генераторы случайных чисел возвращают несколько "истинных" случайных чисел http://en.wikipedia.org/wiki/Hardware_random_number_generator.

Алгоритмы случайных чисел из стандартных библиотек в конечном итоге отображают системные вызовы в ОС. Так, например, в linux вы можете просто читать из /dev/random или /dev/urandom (или вы можете делать то же самое в своем собственном коде).

Также обратите внимание, что истинная случайность может быть достигнута без использования выделенного оборудования или какой-либо специализированной службы. /dev/random и /dev/urandom предоставляют случайные числа, которые для всех целей и целей могут считаться истинными.

EDIT: Некоторые специальные библиотеки или ваш собственный код могут даже использовать сетевую услугу для случайных чисел (многие из которых предоставляют истинные случайные числа).

Ответ 3

Те числа, которые генерируются вашим компьютером, не являются "случайными" по истинному определению "random". Они псевдослучайны - есть алгоритм, который генерирует числа. Здесь вы можете узнать больше о таких числах: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

Ответ 4

Генерация случайных чисел Google: http://en.wikipedia.org/wiki/Random_number_generation

Вист не по-настоящему случайный, я бы выбрал компьютер для создания случайного числа в любой день люди - мусор в случайности, поскольку они ведут себя предсказуемым образом.

см: http://www.physorg.com/news186174216.html

Ответ 5

См. ответ Джои. Существуют также аппаратные случайные генераторы, которые используют некоторый физический процесс для создания nouse и которые могут быть подключены к вашему компьютеру для использования для "истинного" случайного числа (в математическом смысле "истина" является излишней ").

В Unix-подобных устройствах могут быть запрошены в /dev/random и/dev/urandom.

Для онлайн-примера см. http://www.random.org/.

Также убедитесь, что вы смотрите http://en.wikipedia.org/wiki//dev/random.

Ответ 6

Это специфично для Linux, но есть поддержка ОС для "реальной" случайности: /dev/random и /dev/urandom. Вы читаете их как обычные файлы.

random - это реальная случайность, получаемая из физических процессов, таких как нерегулярные задержки в оборудовании, - она ​​исчерпана при ее чтении и криптографически защищена.

urandom - это неограниченный псевдослучайный источник, который получен из random и почти наверняка более высокого качества, чем ваш C-библиотека PRNG.

Ответ 7

Конечно, человек более случайный. Компилятор (фактически, случайный модуль, который компилируется компилятором) использует только некоторый фиктивный случайный (а на самом деле случайный, вероятный) алгоритм для генерации случайного числа.