Случайности
Apr. 5th, 2008 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?
no subject
Date: 2008-04-05 04:10 pm (UTC)>а потом гипотетически вернуться в прошлое и вызвать её снова в абсолютно то же время - будет ли результат тем же?
Если генерация числа чисто программная, то, скорее всего, выпадет то же самое число.
Если аппаратная - то тут современная физика дать однозначного ответа не может. Если разрешения квантовых неопределённостей предопределены, то будет то же самое число. Если нет - то, в общем случае, число может быть другим.
no subject
Date: 2008-04-05 04:21 pm (UTC)no subject
Date: 2008-04-05 04:13 pm (UTC)Существуют генераторы случайных и псевдо-
Date: 2008-04-05 04:27 pm (UTC)Основная масса - генераторы псевдослучайных чисел. Где каждое новое число однозначно определяется предыдущим.
Например
xn+1=(a*xn+1+b) mod m
где mod - операция взятия остатка.
Это самый распространённый тип ГСЧ (на самом деле псевдослучайных чисел) - простой и дающий выглядящую случайно последовательность. В большинстве случаев этого, при правильном подборе a, b и m - хватает (а как правильно - для начального знакомства Д.Кнут, "Искусство программирования для ЭВМ", т.2, гл. 3)
Иногда, в криптографии или игровом деле, нужно не просто похожее на случайное поведение, а истинная непредсказуемость. Для этого берётся некий случайный источник. Например, радиоактивный распад или тепловой шум - ни тот, ни тот по современным представлениям предсказать нельзя. Подобные источники создавались в большом количестве в 50-х, потом их вытеснили куда более удобные псевдослучайные числа (попробуйте отлаживать программу, если не знаете, чему равны значения переменных), а в последнее время такие устройства стали массово доступны, например, включённые в некоторое материнские платы (в основном для криптографии).
Если желательно использовать псевдослучайные числа, но иметь некоторую непредсказуемость - в качестве начального значения ГСЧ берётся некоторое непредсказуемое число (например, значения миллисекунд часов реального времени на момент вызова программы), для этого служит, например, известная функция randomize.
Еще один источник случайных чисел - таблицы, составленные из физических или демографических наблюдений. Например, известный эксперт по ГСЧ Марсалья издал сборник таких чисел под названием "Чёрно-белый шум" - он выбран из младших битов аудиозаписи рэпа. Это истинно случайные числа, но при повторном обращении к ним мы знаем их значения, что может быть важно для отладки.
Re: Существуют генераторы случайных и псевдо-
Date: 2008-04-05 05:43 pm (UTC)Еще скажу, что для всякой криптграфии псевдослучайные числа не очень случайны, поэтому криптожелезо содержит генераторы истиных СЧ. Алсо, то с модулем -- ужас, летящий на крыльях ночи. Но есть и хорошие, но сложные генераторы ПСЧ.
Для отладки принудительно ставят сид, да.
Ну, скомпрометировать, скажем, Mercenne twister...
Date: 2008-04-06 03:27 pm (UTC)Re: Существуют генераторы случайных и псевдо-
Date: 2008-04-06 05:07 am (UTC)Только сейчас обычно используется не тепловой шум, а шум обратно включённого полупроводникового диода. Он определяется в основном туннельными переходами электронов в двойном заряженном слое p-n-перехода, а это истинно квантовый процесс и как таковой сейчас считается непредсказуемым.
no subject
Date: 2008-04-05 06:43 pm (UTC)Т.е., в соверменных компьютерах все предопределнно чем-то. Спасибо.
no subject
Date: 2008-04-05 07:57 pm (UTC)no subject
Date: 2008-04-06 02:58 pm (UTC)no subject
Date: 2008-04-07 07:09 am (UTC)И не таблица и не использование специального железа. Используются "случайные" события, такие как движения мышкой или приход пакета по сети.
По кр. мере в OC Linux есть два спецфайла, чтение из который дает случайные числа разного уровня "случайности":
/dev/random (чисто случайные числа. Но при этом чтение из этого файла может заблокироваться пока не появится какое-то событие, на основе которого можно сгенерировать еще случайных чисел)
/dev/urandom (не очень случайные числа, но при этом чтение всегда сразу же возвратит какое-то псевдослучайное число)
http://en.wikipedia.org/wiki/Urandom
http://linux.die.net/man/4/random