Что является более случайным: число, созданное человеком или программным обеспечением? - PullRequest
4 голосов
/ 06 июля 2011

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

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

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

Ответы [ 7 ]

11 голосов
/ 06 июля 2011

(Примечание: я игнорирую использование слова «компилятор» в вашем вопросе, так как оно на самом деле ничего не значит. Вместо этого обычно речь идет о случайных [и псевдослучайных] числах в вычислениях иих использование.)

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

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

формула LCG: x_ (n + 1) = a⋅x_n + b (mod⁡c) 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 позволяет убедиться, что полученные значения удовлетворяют определенным статистическим свойствам распределения.

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

3 голосов
/ 06 июля 2011

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

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

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

РЕДАКТИРОВАТЬ: библиотека stdlib.h, и это ВСЕГДА псевдослучайное число, как указано Джои и Френеля. Читайте комментарии, чтобы узнать подробности их ответов. Я прошу прощения за ошибку, и я согласен, что я должен был знать лучше, чем отвечать на инстинкт.

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

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

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

РЕДАКТИРОВАТЬ: Некоторые специальные библиотеки или ваш собственный код могут даже использовать сетевой сервис для случайных чисел (многие из которых предоставляют истинные случайные числа).

2 голосов
/ 06 июля 2011

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

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

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

2 голосов
/ 06 июля 2011

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

1 голос
/ 06 июля 2011

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

В Unix-лайках такие устройства могут запрашиваться в / dev / random и /dev/urandom.

.

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

Также обязательно взгляните на http://en.wikipedia.org/wiki//dev/random.

0 голосов
/ 06 июля 2011

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

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

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

0 голосов
/ 06 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...