Я чув, що генерація випадкових чисел у комп’ютерах насправді не випадкова, але не існує ефективного алгоритму, щоб його виявити. Як його взагалі можна виявити?
Я чув, що генерація випадкових чисел у комп’ютерах насправді не випадкова, але не існує ефективного алгоритму, щоб його виявити. Як його взагалі можна виявити?
Відповіді:
Комп'ютери, які справді випадкові:
Справжня випадковість неможлива для машин Тьюрінга в теоретичному сенсі, і більшість комп'ютерів не можуть генерувати справді випадковий вихід. Тому деякі сучасні комп’ютери включають апаратне забезпечення, яке дозволяє комп'ютеру отримати доступ до зовнішнього джерела, яке, сподіваємось, включає деяку випадковість. Одним із прикладів, як це можна досягти, є відстеження невеликих коливань температури всередині комп'ютера. Випадковість може бути отримана і з зовнішнього джерела. Але з тональності вашого допису я не думаю, що зовнішні джерела випадковості - це те, що вас цікавить.
Насіння:
Без зовнішнього доповнення все, що робить комп'ютер, є детермінованим. Це призводить до великої проблеми: якщо ви викликаєте програму генерації випадкових чисел, вона буде давати вам однаковий результат кожного разу, якщо ви дасте їй один і той же вхід. Зрозуміло, що нам потрібна програма, яка виводить випадкове число, щоб змінювати свою поведінку кожного разу, коли вона буде запущена (інакше ми продовжуватимемо отримувати те саме "випадкове" число, що не особливо корисно). Одна ідея полягає в тому, щоб дати програмі деякий вклад, який змінюється щоразу, коли програма запускається, щоб виводилося інше число. Ми називаємо цей вхід "насінням". Генератору випадкових чисел потрібно взяти насіння, виконати деякі операції та дати нам випадкове число.
Поточний системний час є класичним прикладом насіння. Це дає довгу струну з високою ентропією, і якщо час відстежується досить детально (тобто, якщо ваш системний годинник використовує години, то "час" є досить бідним насінням), ви навряд чи зможете подати псевдослучайне число генератор однакове число двічі.
Алгоритми, які є випадковими:
Тепер у нас є алгоритм, який, принаймні, має бути способом бути різним щоразу, коли він запускається. Ми даємо йому насіння, і хоча алгоритм дає те саме число, коли запит із тим самим насінням, ми хочемо, щоб числа, які він створює, були випадковими інакше. Це діє так, як зазначено вище - ви берете деякий вклад, і він дає деякий (сподіваємось, досить різний від входу, щоб бути "випадковим").
Тепер скажімо, що ви створили свій власний алгоритм для цього, і ви стверджуєте, що цифри, які ви придумали, досить близькі до випадкових, коли ви дали йому купу різних насінин. Як би ми перевірили, наскільки це добре?
Тепер ми хочемо якийсь алгоритм, який візьме насіння, зробить деякі операції та створить випадкове число. Найпростіше, алгоритм може просто вивести насіння - він не дає нам однакової кількості кожного разу, а випадкові насіння дають нам випадкові результати. Але явно це не те, що ми хочемо. З іншого боку, алгоритм може бути досить складним, як і багато фактичних генераторів псевдовипадкових випадків. Як ми можемо сказати, які алгоритми дають нам "випадкові" числа з наших не обов'язково випадкових насінин? Якщо ми не можемо його зрозуміти точно, як ми можемо сказати, які найкращі?
Випадково вистачить, щоб обдурити нападника:
Тепер те, про що ви МОЖЕ мати на увазі, це криптографічно захищені псевдовипадкові генератори. Я думаю, що найкращий спосіб пояснити це в контексті вищесказаного - тут ми використовуємо нашу випадковість для криптографії, тому, коли ми розробляємо тести, те, що нас дійсно хвилює, - це те, що хтось не зможе зламати наша безпека, передбачивши, яке випадкове число ми вибрали. Я не знаю вашого рівня знайомості з криптографією, але уявіть, що ми робимо просту заміну циферблату --- кожна літера замінюється якоюсь іншою літерою. Ми хочемо вибрати ці заміни випадковим чином, тому зловмиснику важко здогадатися. Але якщо він зможе зрозуміти, як працює мій генератор випадкових чисел, він зможе вирішити весь шифр! Тому для криптографічних алгоритмів потрібні генератори випадкових чисел, які особливо важко здогадатися.
З цієї причини CSPRG визначаються з точки зору того, наскільки добре їх вирішують інші алгоритми (саме там ми нарешті прийдемо до вашого питання). Зокрема, скажімо, у мене є CSPRG, який я називатиму R. R - це CSPRG, якщо і тільки якщо немає НЕ можливого алгоритму, який може здогадатися, який біт він виведе далі. Це вірно, навіть якщо ви знаєте всі попередні біти, які виводиться!
Тож скажімо, що перші п’ять біт мого CSPRG мають вихід 10100. Ви не знаєте вхід, який я використовував у програмі, але у вас є доступ до коду, який я використовував для написання своєї CSPRG. Тоді твердження полягає в тому, що вам неможливо написати програму, щоб вирішити, чи буде наступний бітовий вихід 101000 або 101001.
Тому з міркувань криптографії іноді, наскільки добре працює генератор псевдовипадкових чисел, визначається з точки зору того, наскільки це передбачувано для інших програм. Зауважте, що це все ще дає велику частину інтуїції "випадковості", як (скажімо), якщо ви знаєте, що всі випадкові виходи будуть непарними, це не є криптографічно безпечним і не проходить тест на випадковість здорового глузду.
Нещодавно в блозі MIT CSAIL Theory of Computation Group я знайшов приємну публікацію про випадковість обчислень: Чи можете ви сказати, чи трохи випадково?
Повідомлення починається з деяких ідей, витягнутих з чудової розмови Аві Вігдерсона про силу та обмеження випадковості в обчисленнях, обстеження прекрасної області рандомізованих алгоритмів та дивовижного зв’язку між псевдовипадковістю та обчислювальною непридатністю .
Потім він підсумовує деякі останні результати з квантової криптографії; зокрема спосіб ефективного тестування, чи вихід певного типу пристроїв справді випадковий (протоколи розширення випадковості).
Наприклад, перегляньте нещодавню роботу Умеша Вазірані, Томаса Відіка, Квантові кістки, що підтверджуються
Анотація: Ми вводимо протокол, за допомогою якого пара квантових механічних пристроїв може використовуватися для генерування n біт справжньої випадковості з насіння однорідних бітів O (log n). Генеровані біти є достовірно випадковими лише на основі простого статистичного тесту, який може бути виконаний користувачем, і на припущенні, що пристрої відповідають принципу без сигналу. Інших припущень не розміщується на внутрішніх робочих пристроях ....
Якщо припустити, що ви говорите про статистичну випадковість - криптографія має інші потреби! - існує ціла низка тестів на придатність, які дозволяють виявити, чи відповідає послідовність чисел заданому розподілу. Ви можете використовувати їх, щоб перевірити, чи є генератором випадкових чисел (псевдо) звуком (до якості вашого тесту та вибраного значення).
Тестові набори Diehard поєднують різні методи.
Це широка / складна тема в галузі інформатики, на яку інша відповідь SamM стосується деяких. Здається, у вашому конкретному питанні, якщо на комп'ютерах є так звані PRNG , тобто псевдогенератори випадкових чисел, як це можна виявити?
Коротка відповідь полягає в тому, що нетривіальні PRNG побудовані так, що їх алгоритми не можуть бути виявлені (похідні). Загалом, якщо PRNG - це те, що називається "захищеним", навіть якщо зловмисник знає алгоритм, який використовується для генерування псевдовипадкової послідовності, вони не можуть вгадати конкретні параметри, що використовуються для генерації послідовності. Таким чином псевдовипадковість має багато глибоких зв’язків з криптографією, і можна говорити про "розрив" PRNG приблизно так само, як криптографічний алгоритм можна "зламати". У цій галузі є багато наукових праць, її активна область в авангарді криптографії.
Для "тривіальних" PRNG, наприклад, лінійного вродженого генератора , якщо зловмисник знає алгоритм, який використовується для його генерування, і він не генерується за допомогою "bignums" , простір пошуку "порівняно невеликий" і зловмисник теоретично також може знайти параметри застосовується конкретним PRNG в основному грубою силою і намагаються всі комбінації.
PRNG можуть бути порушені на практиці (знову ж таки залежно від їх "безпеки") в деяких випадках, застосувавши проти них великий набір статистичних тестів на випадковість. наприклад, це обгрунтування програми "Dieharder" (Браун). Також є набір NIST .
Властива складність / твердість розриву PRNG ще не є строго теоретично доведеною, але в основному пов'язана з тим, що називається "траповим" або "одностороннім функціями", які можна обчислити ефективно в одному напрямку, але їх "важко" перевернути (повернути назад) . У криптографії є деякі відкриті проблеми щодо твердості випадковості. Ці питання тісно пов'язані з розділеннями класів складності, наприклад, відомим питанням P =? NP.
Питання про розрив PRNG також стосуються складності Колмогорова - галузі, яка вивчає найменші машини Тюрінга, які можуть генерувати послідовності. порушення PRNG також тісно пов'язане з пошуком "найкоротшої" програми для обчислення псевдовипадкової послідовності. А складність Колмогорова в цілому не можна визначити.
Як зазначає Жилл у коментарі, існують апаратні РНГ, побудовані з фізичних електронних процесів, таких як квантовий шум. вони, якщо сконструйовані правильно, не руйнуються.
Насправді все, що робить класичний комп’ютер, є детермінованим, в тому сенсі, що, коли ви даєте їм якісь завдання, воно слідує за ними детермінованим чином. Тому, якщо ви хочете мати одне випадкове число, ви можете обчислити його відповідно до часу (виходячи з часу введення користувача), але якщо ви хочете мати набір випадкових чисел, ви не можете використовувати час для наступних чисел, оскільки цифри більше не будуть незалежними.
Що люди роблять - це використовувати псевдовипадкові генератори, які мають насіння, тобто число, яке використовується для обчислення всіх чисел генератора псевдовипадкових чисел (у деяких більш складних випадках моделювання чи інших завданнях може знадобитися більше насіння , якщо потрібно більше одного набору незалежно випадкових чисел). Зазвичай насіння становить 0 або конкретну кількість, якщо ви хочете відтворити результати, або час, якщо ви і інші невідтворювані результати.
Те, що генератори псевдовипадкових чисел досить хороші, полягає в тому, що вони слідують "основним характеристикам генерації псевдовипадкових чисел", щоб обчислити їх ефективно і вести себе як реальні випадкові числа:
З кожного числа послідовності псевдовипадкових чисел обчислюється нове число (зазвичай ми працюємо з цілими числами). Однак існує певний період, n, у послідовності генераторів псевдовипадкових чисел, готових працювати в певній базі з кінцевою кількістю доступних бітів для вираження чисел (наприклад, двійкові). Якщо ця n не буде достатньо великою, виникнуть серйозні проблеми, але не хвилюйтеся, комп'ютерні фахівці добре вибирають насіння та інші параметри псевдовипадкових генераторів для того, щоб мати хороший n.
Наприклад, можливий генератор псевдовипадкових чисел за допомогою лінійного конгруентного методу, який є одним із найстаріших і найвідоміших алгоритмів генераторів псевдовипадкових чисел, може бути визначений відповідно до:
він має чотири значення:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0, де:
x0 - початкове значення, a, c і m - константи, де: m> a, m> c, і це створює послідовність із фортулою:
x_ {i + 1} = (a * x_i + c) MOD m
Значення для цих констант необхідно ретельно вибирати. Одна з можливостей:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, відкр. [1-2]
Є й інші алгоритми, більш складні для генерування випадкових чисел, які уникають деяких проблем попередніх алгоритмів, які включали: [3]
- коротший, ніж очікували, періоди для деяких насіннєвих станів (такі насінні стани можна назвати "слабкими" в цьому контексті);
- відсутність рівномірності розподілу для великої кількості генерованих чисел;
- співвідношення послідовних значень;
- поганий розмірний розподіл вихідної послідовності;
- відстані між тим, де відбуваються певні значення, розподіляються інакше, ніж у розподілі у випадковій послідовності.
Надалі класичні комп'ютери можуть бути об'єднані в квантові системи, які можуть надати дійсно випадкові числа та доставити їх. [4]
посилання:
[1] http://en.wikipedia.org/wiki/linear_congrustven_generator
[2] William H., та ін. (1992). «Числові рецепти у фортран 77: Мистецтво наукових обчислень» (2-е видання). ISBN 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-process-generate-truly-random-numbers /