Как работают генераторы случайных чисел?


23

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

Как работают генераторы случайных чисел?


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

Атмосферный шум гарантированно будет случайным?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Нил

3
Кто-то должен сделать это: xkcd.com/221 ;)
Валера Колупаев

Ответы:


7

Генераторы случайных чисел (ГСЧ) действительно генерируют псевдослучайные числа, поскольку на самом деле невозможно сгенерировать ИСТИННОЕ случайное число. Единственные действительно случайные вещи - это поступки Бога, такие как молния.

Эта статья в Википедии может помочь вам в объяснении: http://en.wikipedia.org/wiki/Random_number_generators


Из того, что я понимаю, в основном есть две части ГСЧ: начальное число, а затем случайное число, выбранное из этого начального числа. Когда вы засеиваете ГСЧ, вы даете ему эквивалент начальной точки. Тогда у этой начальной точки есть набор цифр, которые находятся «внутри», из которых выбирает программа. В PHP вы можете использовать srand (), чтобы «перемешать» семена, так что вы почти всегда получаете другой ответ. Затем вы можете использовать rand (min, max), чтобы войти в семя и выбрать число между min и max включительно.


ВНИМАНИЕ, ВОЗМОЖНАЯ АНАЛОГИЯ СЫРОГО ВПЕРЕДИ!

Думайте о каждом «семени» как о сундуке со льдом, а затем о случайных числах как о кубиках льда. Допустим, у вас есть 1000 сундуков с льдом, а в каждом сундуке 1000 кубиков льда. На окружной ярмарке они выберут ледяной сундук, чтобы начать использовать его для напитков, и они могут использовать только один кубик льда. Однако им нужны только кубики льда размером более 1 кубического дюйма. Таким образом, они выберут сундук случайным образом между этими 1000 сундуками, а затем выберут кубик льда внутри этого сундука наугад. Если это работает для размера, который они хотят, они используют это. Если это не так, они кладут его обратно в грудь вместе с остальными. Если они хотят сделать это немного более увлекательным, они меняют сундуки заранее для полного забвения, если хотите!

Что касается того, как PHP на самом деле физически выбирает начальное число и случайное число, у меня недостаточно знаний для этого (что, вероятно, то, что вам было интересно больше всего!). Я бы не стал пытаться повторить функцию rand (); для большинства веб-приложений, которые вы создадите, rand () должно быть достаточно для любого случайного числа, которое вам нужно.

Также проверьте линейные конгруэнтные генераторы, это может быть больше из того, что вы ищете, если вы хотите грязные детали: http://en.wikipedia.org/wiki/Linear_congruential_generator

Надеюсь это поможет!


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

7
Я использую стихийные бедствия в юридическом смысле: en.wikipedia.org/wiki/Act_of_God Они считаются случайными, поскольку они находятся вне контроля человека.

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

6
@ Корвин, насколько нам известно, квантовые явления, такие как радиоактивный распад или испускание фотона возбужденным атомом, действительно случайны. Однако математики и философы спорят о том, что значит быть по-настоящему случайным. И в то время как обычные люди думают, что бросок монеты - это довольно случайный случай, фокусники на ловкой сцене ( news.stanford.edu/pr/2004/diaconis-69.html ) могут регулярно получать 10 голов за 10 бросков.
Чарльз Грант

1
@Charles - бросок монеты - это даже не бинарные головы / хвосты, это на самом деле головы / хвосты / ребра, так что действительно хороший сценический маг не может заставить его сойти ни с головы, ни с хвоста. * 8 ')
Марк Бут

18

Они обычно не являются действительно случайными, но называются псевдослучайными, потому что они генерируют числовую последовательность, которая выглядит случайной. Это сделано с некоторыми интересными математическими формулами. Одним из наиболее распространенных является линейный конгруэнтный генератор .

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


Если я правильно понимаю ваше второе утверждение: random(5332)всегда будет равно random(5332)?

2
@ Корвин, нет, я имею в виду, что если вы позвоните, srand(5332)то следующий номер, который randбудет возвращен, всегда будет таким же.
Марк Рэнсом

3
«Похоже, случайный» -> имеют те же статистические свойства, что и действительно случайные числа.

+1 для ссылки LGC на Википедию, это отличная анимация того, почему упрощенные PRNG имеют серьезные ограничения при многомерном моделировании Монте-Карло.
Марк Бут

4

Вы спрашиваете о псевдослучайном или случайном? Другие ответили о псевдослучайном, позвольте мне поговорить о Random.

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

OTOH, если вы встретите любого разработчика встроенных систем, они будут смеяться над этим. В общих целях при программировании микроконтроллера считывание младших 4 бит любого 16-разрядного аналого-цифрового преобразователя с плавающим (неподключенным) выводом будет давать совершенно хороший случайный шум при более чем достаточной полосе пропускания (чем короче период опроса, тем больше » "шумные" показания), и легче, чем написание фактической рутины ГСЧ. И, учитывая, что АЦП, как правило, реализованы в кремнии микроконтроллеров, обычно реализуются и часто реализуются с 8 каналами, из которых вам может понадобиться 5 для вашего приложения, это практически бесплатно.

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


2

Существует множество способов эмулировать «случайную» последовательность чисел. Ваша первая остановка должна быть, чтобы прочитать о линейных конгруэнтных генераторах , наверняка. Вот как работают большинство генераторов случайных чисел, и я бы поспорил, как работает функция PHP rand ().

Более интересный следующий вопрос для размышления: как он зародился? время? Айпи адрес? и т.п.


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

3
Я полагаю, что временная метка часто используется в качестве начального начального числа, когда на самом деле она не предоставляется из какого-либо другого источника. В старом бейсике это RANDOMIZE TIMERбыла обычная идиома, и она «достаточно хороша» для большинства (не криптографических) целей. Согласно man 3 srand , библиотека GNU C использует фиксированное начальное число 1, пока PRNG не будет повторно заполнен.
CVn

1

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

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

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


На самом деле, компьютеры в настоящее время имеют доступ к реальным случайным числам: они возникают из-за дрожания во времени прерываний, создаваемых внешними устройствами. Linux использует эти значения малой неопределенности, чтобы постоянно создавать «пул энтропии», который составляет всего несколько килобайт внутреннего состояния. Криптографические хэши на основе этого пул энтропии сделаны возможен через /dev/randomи /dev/urandomустройств. Таким образом, получить доступ к некоторым действительно хорошим случайным числам так же просто, как открыть одно из этих двух устройств и прочитать с них несколько байтов.


-2

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

Существует два типа случайных чисел 1. Истинные случайные числа 2. Псевдослучайные числа.

Как генерируются случайные числа


1
Пожалуйста, используйте форматирование цитаты, чтобы выделить, какие части ответа являются вашими, а какие - из источника, который вы цитируете. Если весь ваш ответ - это копирование / вставка из внешнего источника, это не очень хороший ответ.
Мат

кажется, это не дает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих 6 ответах
комнат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.