http://enforcer-lt.livejournal.com/ (
enforcer-lt.livejournal.com) wrote in
useless_faq2008-04-05 01:40 am
![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Случайности
Вопрос будоражит меня уже давно. Как работает функиция random() в различных языках программирования и написанных на их программах? Она действительно выдает абсолютно случайное значение или оно от чего-то таки зависит?
И главынй вопрос: если вызвать эту функцию и посомтреть её значение, а потом гипотетически вернуться в прошлое и вызвать её снова в абсолютно то же время - будет ли результат тем же? А если с отклонением в пару секунд? Допустим мы вызвали функцию и получили 57. А если бы мы вызвали её не сейчас, а через 2 часа, получили бы мы 57?
И главынй вопрос: если вызвать эту функцию и посомтреть её значение, а потом гипотетически вернуться в прошлое и вызвать её снова в абсолютно то же время - будет ли результат тем же? А если с отклонением в пару секунд? Допустим мы вызвали функцию и получили 57. А если бы мы вызвали её не сейчас, а через 2 часа, получили бы мы 57?
Существуют генераторы случайных и псевдо-
Основная масса - генераторы псевдослучайных чисел. Где каждое новое число однозначно определяется предыдущим.
Например
xn+1=(a*xn+1+b) mod m
где mod - операция взятия остатка.
Это самый распространённый тип ГСЧ (на самом деле псевдослучайных чисел) - простой и дающий выглядящую случайно последовательность. В большинстве случаев этого, при правильном подборе a, b и m - хватает (а как правильно - для начального знакомства Д.Кнут, "Искусство программирования для ЭВМ", т.2, гл. 3)
Иногда, в криптографии или игровом деле, нужно не просто похожее на случайное поведение, а истинная непредсказуемость. Для этого берётся некий случайный источник. Например, радиоактивный распад или тепловой шум - ни тот, ни тот по современным представлениям предсказать нельзя. Подобные источники создавались в большом количестве в 50-х, потом их вытеснили куда более удобные псевдослучайные числа (попробуйте отлаживать программу, если не знаете, чему равны значения переменных), а в последнее время такие устройства стали массово доступны, например, включённые в некоторое материнские платы (в основном для криптографии).
Если желательно использовать псевдослучайные числа, но иметь некоторую непредсказуемость - в качестве начального значения ГСЧ берётся некоторое непредсказуемое число (например, значения миллисекунд часов реального времени на момент вызова программы), для этого служит, например, известная функция randomize.
Еще один источник случайных чисел - таблицы, составленные из физических или демографических наблюдений. Например, известный эксперт по ГСЧ Марсалья издал сборник таких чисел под названием "Чёрно-белый шум" - он выбран из младших битов аудиозаписи рэпа. Это истинно случайные числа, но при повторном обращении к ним мы знаем их значения, что может быть важно для отладки.
Re: Существуют генераторы случайных и псевдо-
Еще скажу, что для всякой криптграфии псевдослучайные числа не очень случайны, поэтому криптожелезо содержит генераторы истиных СЧ. Алсо, то с модулем -- ужас, летящий на крыльях ночи. Но есть и хорошие, но сложные генераторы ПСЧ.
Для отладки принудительно ставят сид, да.
Ну, скомпрометировать, скажем, Mercenne twister...
Re: Существуют генераторы случайных и псевдо-
Только сейчас обычно используется не тепловой шум, а шум обратно включённого полупроводникового диода. Он определяется в основном туннельными переходами электронов в двойном заряженном слое p-n-перехода, а это истинно квантовый процесс и как таковой сейчас считается непредсказуемым.