Чим відрізняються псевдовипадкові та справді випадкові числа і чому це важливо?


666

Я ніколи цього не розумів. Просто скажіть, що ви пишете невелику програму будь-якою мовою, яка розкочує кістки (просто використовуючи кістки як приклад). Після 600 000 рулонів, кожне число було б перекинуто приблизно 100 000 разів, що я б очікував.

Чому існують веб-сайти, присвячені "справжній випадковості"? Безумовно, враховуючи вищезазначене спостереження, шанси отримати будь-яке число майже рівно 1, скільки коли-небудь цифр він може вибрати.

Я спробував це в Python : Ось результат 60 мільйонів рулонів. Найвища варіація - як 0,15. Хіба це не так випадково, як це станеться?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0

1
Подивіться статтю у вікіпедії про апаратні згенеровані випадкові числа Також дивіться це - stats.stackexchange.com/questions/32794/…
steadyfish

21
Що ви маєте на увазі під «котками кісток»? Чи прикріплена рука робота і камера?
starblue

3
хоча я погоджуюсь із загальною суттю твого тону, що ми часто надто переживаємо з цього приводу, але це було використано в реальному житті: en.wikipedia.org/wiki/Ronald_Dale_Harris
Граді гравця

3
Дивіться цю статтю про онлайн-ігри в покер, де відсутня справжня випадковість, чому це важливо.
Варакілекс

1
Якщо ви просто тримаєте лічильник 0-5 і відповідно закидаєте кубики, 666 мільйонів разів, ви також отримаєте рівний розподіл.
jcora

Відповіді:


1388

Давайте пограємо в комп’ютерний покер, тільки ви, я та сервер, яким ми обоє довіряємо. Сервер використовує генератор псевдовипадкових чисел, який ініціалізується 32-бітним насінням безпосередньо перед відтворенням. Тож є близько чотирьох мільярдів можливих колод.

Я маю в руках п’ять карток - мабуть, ми не граємо в Texas Hold 'Em. Припустимо, картки роздаються одній мені, одній вам, одній мені, одній вам тощо. Тож у мене на палубі є перша, третя, п'ята, сьома та дев'ята карти.

Раніше я запускав псевдовипадковий генератор чисел чотири мільярди разів, один раз з кожним насінням, і записував першу карту, сформовану для кожного в базу даних. Припустимо, моя перша картка - пікова дама. Це відображається лише в якості першої картки в одній із 52 можливих колод, тому ми скоротили можливі колоди з чотирьох мільярдів до приблизно 80 мільйонів або близько того.

Припустимо, моя друга картка - це три серця. Зараз я запускаю свої RNG ще в 80 мільйонів разів, використовуючи 80 мільйонів насіння, які дають пікову королеву як перше число. Це займає у мене пару секунд. Я записую всі колоди, які виробляють три серця, як третю карту - другу карту в моїй руці. Це знову лише близько 2% колод, тож зараз ми знизилися до 2 мільйонів колод.

Припустимо, третьою картою в моїй руці є 7 клубів. У мене є база даних з 2 мільйонами насінин, які видають дві мої картки; Я запускаю свій RNG ще 2 мільйони разів, щоб знайти 2% тих колод, які видають 7 клубів як третю карту, і ми знизилися до лише 40 тисяч колод.

Ви бачите, як це йде. Я запускаю свій RNG ще 40000 разів, щоб знайти всі насіння, які дають мою четверту карту, і це зводить нас до 800 колод, а потім запускаю його ще 800 разів, щоб отримати ~ 20 насінин, які дають мою п'яту карту, і тепер я просто генеруйте ці двадцять колод карт, і я знаю, що у вас є одна з двадцяти можливих рук. Більше того, я дуже добре розумію, що я буду малювати далі.

Тепер ви бачите, чому важлива справжня випадковість? Як ви описуєте це, ви вважаєте, що розподіл важливий, але розподіл - це не те, що робить процес випадковим. Непередбачуваність - це те, що робить процес випадковим.

ОНОВЛЕННЯ

На підставі (зараз видалених через їх неконструктивний характер) коментарів принаймні 0,3% людей, які читали це, плутають мою думку. Коли люди сперечаються з пунктами, які я не робив, або, що ще гірше, сперечаються з пунктами, які я робив, припускаючи, що я їх не робив, то я знаю, що мені потрібно пояснити більш чітко і уважно.

Здається, існує певна плутанина навколо розповсюдження слів, тому я хочу ретельно закликати до звичаїв.

Питання:

  • Як відрізняються псевдовипадкові числа та справді випадкові числа?
  • Чому різниця важлива?
  • Чи різниці мають щось спільне з розподілом випуску PRNG?

Почнемо з розгляду ідеального способу генерування випадкової колоди карт, за допомогою яких можна грати в покер. Тоді ми побачимо, чим відрізняються інші методи генерування колод, і чи можна скористатися цією різницею.

Почнемо з того, що ми маємо чарівну коробку з написом TRNG. Як його вхід, ми даємо йому ціле число n, що більше або дорівнює одиниці, і як його вихід дає нам справді випадкове число між одиницею і n, включно. Вихід з поля абсолютно непередбачуваний (якщо йому задано число, відмінне від одного), і будь-яке число між одним і n є таким же ймовірним, як і інше; це означає, що розподіл є рівномірним . (Є й інші більш вдосконалені статистичні перевірки випадковості, які ми могли б виконати; я ігнорую цей момент, оскільки він не є звичним для мого аргументу. TRNG ідеально статистично випадковий за припущенням.)

Починаємо з нерозміщеної колоди карт. Попросимо поле для числа між одним і 52 - тобто TRNG(52). Незалежно від того, яке число воно дає, ми відраховуємо стільки карток з нашої відсортованої колоди та вилучаємо її. Це стає першою карткою на перетасованій колоді. Потім ми просимо TRNG(51)і робимо те саме, щоб вибрати другу карту тощо.

Ще один спосіб поглянути на це: їх 52! = 52 x 51 x 50 ... x 2 x 1 можливі колоди, що приблизно становить 2 226 . Ми вибрали одну з них насправді навмання.

Тепер ми розбираємось з картками. Коли я дивлюся на свої картки, я поняття не маю, які картки у вас є. (Окрім очевидного факту, що у вас немає жодної з карток у мене.) Вони можуть бути будь-якими картками з однаковою ймовірністю.

Тож дозвольте мені переконатися, що я це чітко пояснюю. Ми маємо рівномірний розподіл кожного окремого випуску TRNG(n); кожен вибирає число між 1 і n з вірогідністю 1 / n. Також результат цього процесу полягає в тому, що ми обрали один із 52! можливі палуби з ймовірністю 1/52!, тому розподілом по безлічі можливих колод є також рівномірної.

Гаразд.

Тепер припустимо, що у нас є менш магічний ящик, позначений етикеткою PRNG. Перш ніж ви зможете використовувати його, його потрібно посіяти 32-бітним безпідписаним номером.

АСІДА: Чому 32 ? Хіба це не може бути посіяне 64-або 256- або 10000-бітним числом? Звичайно. Але (1) на практиці більшість позачергових ПРНГ висівають з 32-розрядним числом, і (2) якщо у вас є 10000 біт випадковості, щоб зробити насіння, то чому ви взагалі використовуєте PRNG? У вас вже є джерело 10000 біт випадковості!

Так чи інакше, поверніться до того, як працює PRNG: після посіву ви можете використовувати його так само, як і ви TRNG. Тобто ви передаєте це число, n, і воно повертає вам число між 1 і n включно. Більше того, розподіл цього випуску більш-менш рівномірний . Тобто, коли ми запитуємо PRNGчисло від 1 до 6, ми отримуємо 1, 2, 3, 4, 5 або 6, приблизно, шосту частину часу, незалежно від того, яке насіння було.

Я хочу кілька разів наголосити на цьому, тому що він, мабуть, бентежить певних коментаторів. Розподіл PRNG є рівномірним щонайменше двома способами. По-перше, припустимо, ми обираємо будь-яке конкретне насіння. Ми очікували, що послідовність PRNG(6), PRNG(6), PRNG(6)...в мільйон разів призведе до рівномірного розподілу чисел між 1 і 6. І по-друге, якби ми вибрали мільйон різних насінин і покликали PRNG(6) один раз для кожного насіння, знову ми очікували б рівномірного розподілу чисел від 1 до 6. Рівномірність ПРНГ в будь-якій з цих операцій не стосується нападу, який я описую .

Цей процес, як кажуть, є псевдовипадковим, оскільки поведінка коробки насправді повністю детермінована; він вибирає один з 2 32 можливих способів поведінки на основі насіння. Тобто, після того, як вона висіяна, PRNG(6), PRNG(6), PRNG(6), ... виробляється послідовність чисел з рівномірним розподілом, але ця послідовність повністю визначається насінням. Для заданої послідовності викликів, скажімо, PRNG (52), PRNG (51) ... і так далі, існує лише 2 32 можливі послідовності. Насіння по суті вибирає, який з них ми отримаємо.

Для генерування колоди тепер сервер генерує насіння. (Як? Ми повернемося до цього питання.) Потім вони дзвонять PRNG(52), PRNG(51)і так далі , щоб створити палубу, подібну раніше.

Ця система сприйнятлива до атаки, яку я описав. Для нападу на сервер ми спочатку, заздалегідь, закладаємо власну копію коробки з 0 і запитуємо PRNG(52)та записуємо це. Потім ми повторно засіваємо 1, запитуємо PRNG(52)і записуємо це, аж до 2 32 -1.

Тепер сервер покеру, який використовує PRNG для генерації колод, повинен якось генерувати насіння. Не має значення, як вони це роблять. Вони могли закликати TRNG(2^32)отримати справді випадкове насіння. Або вони могли сприймати поточний час як насіння, що навряд чи є випадковим; Я знаю, котрий час так само, як і ти. Сенс моєї атаки полягає в тому, що це не має значення, оскільки я маю свою базу даних . Коли я бачу свою першу карту, я можу усунути 98% можливих насінин. Коли я бачу свою другу карту, я можу ліквідувати на 98% більше тощо, поки в кінцевому підсумку я не можу зійти до жмені можливих насінин і з великою часткою ймовірності знати, що у вас в руці.

Тепер ще раз хочу підкреслити, що тут припущення полягає в тому, що якби ми зателефонували PRNG(6)мільйон разів, ми отримали кожне число приблизно в шосту частину часу . Цей розподіл є (більш-менш) рівномірним , і якщо рівномірність цього розподілу - все, що вам цікаво , це добре. Суть питання в тому, чи є інші речі, про PRNG(6)те, що нас цікавить? і відповідь - так . Ми дбаємо і про непередбачуваність .

Інший спосіб розглянути проблему полягає в тому, що, хоча розподіл мільйона дзвінків PRNG(6)може бути нормальним, оскільки PRNG обирає лише 2 32 можливі поведінки, він не може генерувати всі можливі колоди. Він може генерувати лише 2 32 з 2 226 можливих колод; крихітна частка. Тож розподіл по набору всіх колод дуже поганий. Але знову ж таки, фундаментальна атака заснована на тому, що ми змогли успішно передбачити минуле та майбутнє поведінку PRNGз невеликого зразка її результатів.

Дозвольте сказати це в третій-чотири рази, щоб переконатися, що це занурилося. Тут є три розподіли. По-перше, розподіл процесу, який виробляє випадкове 32-бітове насіння. Це може бути абсолютно випадковим, непередбачуваним та рівномірним, і атака все одно спрацює . По-друге, розподіл мільйона дзвінків до PRNG(6). Це може бути ідеально рівномірним, і атака все одно спрацює. По-третє, розподіл колод, обраний описаним мною псевдовипадковим процесом. Цей розподіл вкрай поганий; може бути обрана лише крихітна частка можливих колод IRL. Напад залежить від передбачуваності поведінки ПРНГ на основі часткових знань про її вихід .

ВІДПОВІДЬ: Ця атака вимагає, щоб зловмисник знав або міг відгадати, який саме алгоритм використовується PRNG. Чи реально це чи ні, це питання відкрите. Однак, розробляючи систему безпеки, ви повинні спроектувати її для захисту від атак, навіть якщо зловмисник знає всі алгоритми програми . По-іншому: частина системи безпеки, яка повинна залишатися таємною, щоб система була захищеною, називається "ключем". Якщо ваша система залежить від її безпеки від алгоритмів, які ви використовуєте як секрет, то ваш ключ містить ці алгоритми . Це надзвичайно слабка позиція!

Жити далі.

Тепер припустимо, що у нас є третя магічна коробочка з написом CPRNG. Це криптовалютна версія PRNG. Це займає 256-бітове насіння, а не 32-бітове насіння. Він ділиться з PRNGвластивістю того, що насіння обирає одну з 2 256 можливих поведінок. Як і у інших наших машин, властивість полягає в тому, що велика кількість дзвінків CPRNG(n)виробляє рівномірний розподіл результатів між 1 і n: кожен відбувається 1 / n часу. Чи можемо ми здійснити нашу атаку проти цього?

Наша первісна атака вимагає від нас зберігати 2 32 відображення від насіння до PRNG(52). Але 2 256 - значно більша кількість; цілком нездійсненно запускати CPRNG(52)це багато разів і зберігати результати.

Але припустимо, є якийсь інший спосіб прийняти значення CPRNG(52)і з цього вивести факт про насіння? Ми були досить тупі до цих пір, просто грубо змушуючи всі можливі комбінації. Чи можемо ми заглянути всередину чарівної скриньки, зрозуміти, як вона працює, і на основі результатів вивести факти про насіння?

Ні. Деталі є занадто складними для пояснення, але CPRNG розроблені розумно, щоб неможливо було вивести будь-який корисний факт про насіння з першого виходу CPRNG(52)або з будь-якого підмножини виходу, незалежно від того, наскільки великим .

Гаразд, тепер припустимо, що сервер використовує CPRNGдля генерації колод. Для цього потрібно 256-бітове насіння. Як він вибирає це насіння? Якщо він обирає будь-яке значення, яке може передбачити нападник, то раптом атака знову стає життєздатною . Якщо ми зможемо визначити, що з 2 256 можливих насінин, сервер, ймовірно, буде обраний лише чотири мільярди, тоді ми знову повернемося до справи . Ми можемо знову здійснити цю атаку, лише звертаючи увагу на малу кількість насіння, яке можливо може бути сформовано.

Тому сервер повинен зробити роботу над тим, щоб 256-бітове число було розподілено рівномірно - тобто кожне можливе насіння вибирається з вірогідністю 1/2 256 . В основному сервер повинен закликати TRNG(2^256)-1генерувати насіння для CPRNG.

Що робити, якщо я можу зламати сервер і зазирнути в нього, щоб побачити, яке насіння було обрано? У такому випадку зловмисник знає повне минуле і майбутнє CPRNG . Автору сервера потрібно захиститись від цієї атаки! (Звичайно, якщо я можу успішно влаштувати цю атаку, то, ймовірно, я можу також просто перерахувати гроші на свій банківський рахунок безпосередньо, тому, можливо, це не так цікаво. Сенс полягає в тому, що насіння має бути важко здогадатися таємницею, і воістину випадкове 256-бітове число досить важко здогадатися.)

Повернувшись до свого попереднього моменту про глибоку захист: 256-бітове насіння є ключем до цієї системи безпеки. Ідея CPRNG полягає в тому, що система захищена до тих пір, поки ключ захищений ; навіть якщо відомий кожен інший факт про алгоритм, доки ви можете зберігати ключовий секрет, карти противника непередбачувані.

Гаразд, тому насіння має бути одночасно таємним і рівномірно розподіленим, тому що якщо його немає, ми можемо здійснити атаку. Ми маємо припущення, що розподіл результатів CPRNG(n)є рівномірним. А як щодо розподілу на наборі всіх можливих колод?

Можна сказати: є 2 256 можливих послідовностей, що виводяться CPRNG, але є лише 2 226 можливих колод. Тому є більше можливих послідовностей, ніж деки, тому ми добре; всі можливі колоди IRL зараз (з великою часткою ймовірності) можливі в цій системі. І це хороший аргумент, окрім ...

2 226 - це лише наближення 52 !. Розділіть його. 2 256/52 ! можливо, це не може бути цілим числом, бо, за одну річ, 52! ділиться на 3, але потужність двох не має! Оскільки це не ціла кількість, зараз у нас ситуація, коли всі колоди можливі , але деякі колоди швидше, ніж інші .

Якщо це не зрозуміло, розгляньте ситуацію з меншою кількістю. Припустимо, у нас є три карти, A, B і C. Припустимо, ми використовуємо PRNG з 8-бітним насінням, тому є 256 можливих насінин. Є 256 можливих виходів PRNG(3)залежно від насіння; немає можливості, щоб одна третина з них була A, третина - B, а третина - C, оскільки 256 не поділяється на 3. Має бути невеликий ухил до одного з них.

Аналогічно, 52 не ділиться рівномірно на 2 256 , тому має бути деякий ухил по відношенню до деяких карток як обраної першої картки та відхилення від інших.

У нашій оригінальній системі з 32-бітним насінням було масове зміщення, і переважна більшість можливих колод ніколи не вироблялася. У цій системі можуть вироблятися всі колоди, але розподіл колод все ще є недоліком . Деякі колоди є дуже трохи більші, ніж інші.

Тепер питання полягає в тому: чи маємо ми атаку на основі цієї вади? і відповідь на практиці, мабуть, ні . CPRNG розроблені таким чином, що якщо насіння справді випадкове, то обчислити різницю між CPRNGі таку обчислювально неможливо TRNG.

Добре, так що давайте підведемо підсумки.

Як відрізняються псевдовипадкові числа та справді випадкові числа?

Вони відрізняються рівнем передбачуваності, який вони демонструють.

  • Дійсно випадкові числа не передбачувані.
  • Всі псевдовипадкові числа передбачувані, якщо насіння можна визначити чи здогадатися.

Чому різниця важлива?

Тому що є програми, де безпека системи спирається на непередбачуваність .

  • Якщо для вибору кожної картки використовується TRNG, то система недоступна.
  • Якщо CPRNG використовується для вибору кожної картки, система захищена, якщо насіння є непередбачуваним і невідомим.
  • Якщо використовується звичайний PRNG з невеликим насіннєвим простором, система не захищена незалежно від того, насіння непередбачуване чи невідоме; достатньо невеликий насіннєвий простір чутливий до нападів, які я описав.

Чи різниця має щось спільне з розподілом випуску PRNG?

Рівномірність розподілу або їх з- за відсутності окремих викликів до RNG(n)не відноситься до атак , які я описав.

Як ми бачили, і a, PRNGі CPRNGвиробляють погані розподіли ймовірності вибору будь-якої окремої колоди з усіх можливих колод. Це PRNGзначно гірше, але в обох є проблеми.

Ще одне питання:

Якщо TRNG набагато кращий, ніж CPRNG, який, в свою чергу, набагато кращий, ніж PRNG, чому хтось використовує CPRNG або PRNG?

Дві причини.

Перший: витрати. TRNG коштує дорого . Генерувати справді випадкові числа важко. CPRNG дають хороші результати для довільно багатьох викликів із лише одним дзвінком на TRNG для насіння. З нижньої сторони, звичайно, ви повинні зберігати це насіння в секреті .

По-друге: іноді ми хочемо передбачити, і все, що нам важливо, - це хороший розподіл. Якщо ви генеруєте "випадкові" дані в якості програмних входів для тестового набору, і він виявляє помилку, тоді було б непогано, що запуск тестового набору знову видає помилку!

Я сподіваюся, що зараз це набагато зрозуміліше.

Нарешті, якщо вам сподобалося це, то вам може сподобатись подальше читання на тему випадковості та перестановки:


19
Гаразд, хлопці та дівчата. Цього зараз достатньо коментувати. Якщо ви хочете обговорити це далі, займіться чатом, kthnxbye!
Іво Фліпс

1
@Eric Але насіння не скидається перед кожним новим малюнком колоди, чи не так? Тож, як ви вірні, що є лише відносно мало траєкторій, з яких ми відбираємо вибірки, ви не знаєте точно, де ви знаходитесь в траєкторії, і траєкторії перетинаються.
AS


Хороше (але щільне) опрацювання пов'язаних питань - це у TAOCP, том 2, розділ 3.5 "Що таке випадкова послідовність?" (Стор. 149) Кнута, починаючи з висвітлення визначень послідовно розподілених, k-розподілених та ∞ розподілених послідовностей. Псевдовипадкові послідовності обговорюються в 3.5.F (стор. 170). Дивіться також критерії псевдовипадковості з теорії складності та німецької BSI .
ShreevatsaR

160

Як каже Ерік Ліпперт, це не просто розповсюдження. Є й інші способи вимірювання випадковості.

Один з ранніх генераторів випадкових чисел має послідовність у найменш значущому біті - він чергував 0 та 1. Тому LSB був 100% передбачуваним. Але турбуватися про це потрібно більше. Кожен біт повинен бути непередбачуваним.

Ось хороший спосіб подумати над проблемою. Скажімо, ви генеруєте 64 біти випадковості. Для кожного результату візьміть перші 32 біти (A) та останні 32 біти (B) та введіть індекс у масив x [A, B]. Тепер виконайте тест мільйон разів, і для кожного результату збільште масив на це число, тобто X [A, B] ++;

Тепер намалюйте 2D-схему, де чим більше число, тим яскравіше піксель у цьому місці.

Якщо він справді випадковий, колір повинен бути рівномірним сірим. Але ви можете отримати шаблони. Візьмемо для прикладу цю діаграму «випадковості» у послідовності TCP системи Windows NT:

Windows NT

або навіть цей із Windows 98:

Windows 98

І ось випадковість реалізації маршрутизатора Cisco (IOS). Cisco ISO

Ці діаграми люб'язно подано у статті Міхала Залевського . У цьому конкретному випадку, якщо можна передбачити, яким буде номер послідовності TCP у системі, можна представити цю систему під час з'єднання з іншою системою - це дозволило б викрасти з'єднання, перехопити зв’язок тощо. І навіть якщо ми не можемо передбачити наступне число в 100% часу, якщо ми можемо спричинити створення нового підключення під нашим контролем , ми можемо збільшити шанс на успіх. І коли комп’ютери можуть створити 100 000 з'єднань за кілька секунд, шанси на вдалу атаку переходять від астрономічної до можливої ​​або навіть ймовірної.


30
Це так геніально, що приносить мені сльози на очі. Має бути програма, яка створює їх для кожної ОС (мобільний / настільний / сервер) та платформи (JVM / Javascript / тощо).
HDave

5
Функція Windows rand () досить хороша! Це створює хмару, яка не має явних шаблонів. Перегляньте мою реалізацію, щоб спробувати її (та інші алгоритми): github.com/Zalastax/visualize_random
Zalastax

93

Хоча псевдовипадкові числа, породжені комп’ютерами, прийнятні для більшості випадків використання, з якими стикаються користувачі комп'ютерів, існують сценарії, які вимагають абсолютно непередбачуваних випадкових чисел.

У чутливих до безпеки додатках, таких як шифрування, генератор псевдовипадкових чисел (PRNG) може створювати значення, які, хоча і випадкові за зовнішнім виглядом, насправді передбачувані зловмисником. Хтось, хто намагається зламати систему шифрування, може вгадати ключі шифрування, якщо використовувався PRNG, а зловмисник має інформацію про стан PRNG. Отже, для таких застосувань необхідний генератор випадкових чисел, який створює значення, які справді не можна використовувати. Зауважте, що деякі PRNG розроблені таким чином, щоб бути криптографічно захищеними і можуть бути використані для таких програм, що залежать від безпеки.

Більше інформації про атаки на СПГ можна знайти в цій статті Вікіпедії .


9
Криптографічні PRNG існують і широко використовуються. Вони можуть із насіння невеликого розміру генерувати практично необмежений потік випадкових чисел. Розрахувати такий потік від справжніх випадкових чисел обчислювально, тому жодна додаткова інформація не може бути отримана з будь-якої частини такого потоку, і для будь-якої практичної мети числа є такими ж хорошими, як істинні випадкові числа.
aaaaaaaaaaaa

Я думаю, що найпростішим способом пояснити це є те, що алгоритми генератора випадкових чисел повинні бути запрограмовані. Це означає, що існує набір інструкцій, яких слід дотримуватися. Якщо є набір інструкцій, це не може бути випадковим.
Келтарі

6
@Keltari Вам не вистачає елемента ентропії ... Більшість RNG (принаймні криптографічні) збирають вхід із зовнішніх джерел (наприклад, рух миші) і використовують це як частину початкової умови - таким чином, перетворення з Aна Bв програмується, але початковий стан A(повинен) бути непридатним. Linux /dev/randomзбереже приблизну кількість ентропії і перестане видавати цифри, якщо вона впаде занадто низько.
Основні

З цікавості - чому ламові лампи вважаються "справді випадковими"? Я розумію, це проявляє досить непередбачувану поведінку, але хтось із достатньо твердим розумінням динаміки рідини і як ці рідини взаємодіють у гравітаційному середовищі Землі, безумовно, можуть дати "передбачувані" результати, ні? Звичайно, лавові лампи непередбачувані, але для мене вони зовсім не випадкові, але дуже передбачувані.
theGreenCabbage

1
@theGreenCabbage: Я підозрюю, що ламові лампи хаотичні. Враховуючи досить хорошу комп’ютерну модель і достатньо цифр точності, ви могли (в принципі) передбачити поведінку на деякий час. Але оскільки система хаотична, дві лавові лампи з найменшою зміною початкових умов швидко розходяться в поведінці. (І цей коментар ігнорує хаотичні атрактори.)
dmm

76

Я спробував це в Python: Ось результат 60 мільйонів рулонів. Найвища варіація - як 0,15. Хіба це не так випадково, як це станеться?

Насправді це так «добре», що погано ... Усі існуючі відповіді зосереджуються на передбачуваності з огляду на невелику послідовність початкових значень. Я хочу порушити ще одне питання:

    ваш розподіл має набагато менші стандартні відхилення, ніж повинні випадкові рулони

Правда хаотичність просто не приходить цілком , що близько до усереднення «майже точно 1 над тим, як ніколи багато чисел можна вибрати з» , що ви використовуєте в якості показника якості.

Якщо ви подивитесь на це питання Stack Exchange щодо розподілу ймовірностей для декількох рулонів кісток , ви побачите формулу для стандартного відхилення N рулонів кісток (якщо припустити справді випадкові результати):

 sqrt(N * 35.0 / 12.0).

Використовуючи цю формулу, стандартне відхилення для:

  • 1 млн рулонів - 1708
  • 60 мільйонів рулонів - 13229

Якщо ми подивимось на ваші результати:

  • 1 млн рулонів: stddev (1000066, 999666, 1001523, 999452, 999294, 999999) становить 804
  • 60 мільйонів рулонів: stddev (9997653, 9997789, 9996853, 10006533, 10002774, 9998398) становить 3827

Ви не можете очікувати, що стандартне відхилення кінцевого зразка точно відповідає формулі, але воно повинно наблизитися досить близько. Тим не менше, на 1 мільйон рулонів у вас менше половини належного stddev, а на 60 мільйонів ви менше третини - стає гірше, і це не випадково ....

Псевдо-RNG, як правило, рухаються через послідовність чітких чисел, починаючи з насіння і не переглядаючи початкове число протягом певного періоду. Наприклад, реалізація старої rand()функції бібліотеки С зазвичай має період 2 ^ 32, і вони відвідуватимуть кожне число між 0 і 2 ^ 32-1 рівно один раз, перш ніж повторювати початкове. Отже, якщо ви імітували 2 ^ 32 кістки, котиться попередній модуль (%) результати включатимуть кожне число від 0 до 2 ^ 32, кількість кожного результату 1-6 буде 715827883 або 715827882 (2 ^ 32 не кратне 6), а стандартне відхилення, таким чином, лише тривіально вище 0. Використання у формулі, наведеній вище, правильне стандартне відхилення для 2 ^ 32 рулонів - 111924. У будь-якому разі, коли кількість ваших псевдовипадкових рулонів збільшується, ви сходяться до 0 стандартного відхилення. Можливо, очікується, що ця проблема буде значною, коли кількість рулонів є значною часткою періоду, але деякі псевдо-RNG можуть мати гірші проблеми - або проблеми навіть із меншою кількістю зразків - ніж інші.

Тож навіть якщо ви не переймаєтесь криптовалютними вразливими місцями, у деяких додатках ви можете піклуватися про розповсюдження, які не мають надмірно штучно рівних результатів. Деякі типи моделювання цілком конкретно намагаються вирішити наслідки нерівномірних результатів, які, природно, трапляються з великими вибірками індивідуально випадкових результатів, але вони недостатньо представлені в результатах деяких pRNG. Якщо ви намагаєтеся імітувати, як величезна кількість населення реагує на якусь подію, ця проблема може кардинально змінити ваші результати, що призведе до дико неточних висновків.


Щоб навести конкретний приклад: Скажімо, математик розповідає програмісту на машині для покеру, що після 60 мільйонів імітованих рулонів - використовуються для мерехтіння сотень маленьких «вогників» по ​​екрану, якщо там було 10,013,229 або більше шестидесятників, які математик розраховує бути 1 stddev від середнього, мала бути виплата. За правилом 68–95–99,7 (Вікіпедія) це повинно відбуватися приблизно 16% часу (~ 68% потрапляють у стандартне відхилення / лише половина зовні знаходиться вище). У вашому генераторі випадкових чисел це приблизно від 3,5 стандартних відхилень вище середнього: Менше 0,025% шансу - майже жоден клієнт не отримує цієї вигоди. Дивіться таблицю "Вищі відхилення" на щойно згаданій сторінці, зокрема:

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

Ви порівнюєте тут яблука та апельсини. Два стандартних відхилення абсолютно не мають нічого спільного.
Jbeuh

50

Я щойно написав цей генератор випадкових чисел для створення рулонів кісток

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

Ви використовуєте його так

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

тощо. Чи будете ви раді використовувати цей генератор для програми, яка проводила гру з кубиками? Пам'ятайте, його розподіл - це саме те, чого ви очікували б від "справді випадкового" генератора!

Генератори псевдовипадкових чисел роблять по суті те ж саме - вони генерують передбачувані числа з правильним розподілом. Вони погані з тієї ж причини, що спрощений генератор випадкових чисел вище - поганий - вони не підходять для ситуацій, коли потрібна справжня непередбачуваність, а не тільки правильний розподіл.


2
"Генератори псевдовипадкових чисел ... генерують передбачувані числа при правильному розподілі" - Просто тому, що це PRNG не гарантує, що він має ідеальний розподіл (насправді, комерційні за великим рахунком не роблять, точно причини, викладені в цих відповідях). Хоча вони можуть бути передбачуваними з огляду на достатню інформацію (використовувана альго, вихідне насіння, вихідні значення, з / п), вони все ще мають відхилення.
Брайан S

3
Крім того, точки, я знаю, але get_generator = lambda: itertools.cycle(range(1,7)), generator = get_generator(), next(generator) # and so onпросто занадто елегантний , не кажучи вже :)
Янус Troelsen

2
@BrianS Насправді, PRNG, який невдало перевіряв дистрибуцію з часом, був би передбачуваний за визначенням. Тож над великими N, якщо ви отримаєте хоч трохи шляху від N / 2 голів у N монетах, ви можете почати робити ставки на голови, і ви можете виграти більше, ніж програєте. Так само, якби у вас ідеальний розподіл хвостів проти головок, але голови завжди були в парі, ви знову отримаєте рецепт перемоги. Тести на розповсюдження - це те, як ви знаєте, що PRNG - це користь.
Йон Кіпарський

1
Ви забули nonlocal next:-).
Кос

5
Ще кращий приклад: вважається, що Pi є нормальним , тобто будь-яка послідовність цифр будь-якої заданої довжини в будь-якій базі з'являється не частіше, ніж будь-яка інша послідовність такої довжини в цій базі. Алгоритм, який при запиті n випадкових бітів бере наступні n біт пі та повертає їх ("насіння" - це біт, який ви починаєте), з часом повинен забезпечити ідеально рівномірний розподіл. Але ви все одно не хочете цього для свого генератора - хтось, хто знає останню згенеровану вами біт, може виявити перший раз, коли з’явиться послідовність, припустимо, що ваше насіння є там, і, ймовірно, буде правильним.
cpast

26

Генерація випадкових чисел, яку може виконати ваш комп’ютер, підходить для більшості потреб, і ви навряд чи зможете зіткнутися з часом, коли вам потрібно справді випадкове число.

Однак справжнє генерація випадкових чисел має свої цілі. У галузі комп'ютерної безпеки, азартних ігор, великих статистичних вибірок тощо.

Якщо вас цікавлять програми випадкових чисел, ознайомтеся зі статтею Вікіпедії .


12
Велике питання полягає в тому, коли вам потрібні випадкові цифри, які зловмисник не може передбачити з міркувань безпеки.
Девід Шварц

16
Ви впевнені, що пекло, можливо, наткнеться на час, коли вам потрібно справді випадкове число. Досить відкрити веб-сторінку, яка починається з https://...
Ян Худек

3
@JanHudec: Ну, при щоденному використанні вам знадобляться випадкові числа, коли ви відкриєте будь-яку програму, задовго до введення в адресний рядок: див . Рандомізацію макета адресного простору . Тому такі речі трапляються.
Рейд

5
@JanHudec Я спеціально говорив у тому сенсі, що вам потрібно буде використовувати онлайн-генератор випадкових чисел. Справжні випадкові числа використовуються часто, але дуже мало людей насправді потребує їх генерування.
Алекс Маккензі

2
Ігрові автомати також використовують PRNG, а не TRNG. Генератор працює весь час, і число вибирається в той момент, коли натиснута кнопка віджиму. Сума PRNG та дійсно випадковий час натискання кнопки становить TRNG.
Роджер Даль

26

Випадкові числа, породжені типовими функціями у більшості мов програмування, не є суто випадковими числами. Вони є псевдо випадковими числами. Оскільки вони не є виключно випадковими числами, їх можна здогадатися з достатньою інформацією про раніше створені числа. Тож це стане катастрофою для безпеки в криптографії .

Для прикладу наступна функція генератора випадкових чисел, що використовується glibc, не генерує чисто випадкове число. Псевдо випадкове число, породжене цим, можна здогадатися. Це помилка з питань безпеки. Існує історія того, що це стає згубним. Це не слід використовувати в криптографії.

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

Цей тип генератора псевдовипадкових чисел ніколи не повинен використовуватися в чутливих до безпеки місцях, хоча статистично набагато значущий.

Однією з відомих атак на псевдо випадковий ключ є атака на 802.11b WEP . WEP має 104-бітний довготерміновий ключ, об'єднаний з 24-бітовим IV (лічильником), щоб зробити 128-бітний ключ, який, в свою чергу, застосовується до алгоритму RC4 для генерації псевдослучайного ключа.

( RC4( IV + Key ) ) XOR (message)

Клавіші були тісно пов’язані між собою. Тут лише IV збільшувався на 1 на кожному кроці, а всі інші залишалися однаковими. Оскільки це було не чисто випадково, воно було катастрофічним і легко розбивалося. Ключ можна було б отримати, проаналізувавши близько 40000 кадрів, це справа хвилин. Якщо WEP використовував чисто випадковий 24-розрядний IV, то він міг би бути безпечним до приблизно 2 ^ 24 (майже 16,8 мільйона) кадрів.

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


3
Я б звинувачував WEP в погано розробленому протоколі, використовуючи слабкий шифр. З сучасними потоковими шифрами ви можете використовувати лічильник як IV.
CodesInChaos

2
Основна проблема WEP полягала в повторенні ключа в 2 ^ 24 (майже 16 мільйонах) кадрах. Ще гірше було з пов'язаними клавішами, що дозволило зламати код приблизно в 40000 кадрів. Тут головне - ключ не випадковий. Це тісно пов'язане, так що це легко зламати.
Прабху

1
Псевдовипадковість криптовалюта погана лише при генерації криптографічних ключів . Це прекрасно поза цим. Дійсно, RC4 - це трохи більше, ніж генератор псевдовипадкових чисел, засіяний 128-бітним розширенням ключа XORed на простому тексті повідомлення.
Мет

12

Різниця полягає в тому, що псевдовипадкові породжені числа передбачувані (повторюються) через деякий час, коли справжні випадкові числа відсутні. Довжина, яку потрібно повторити, залежить від довжини насіння, яке використовується для його вирощування.

Ось приємне відео на цю тему: http://www.youtube.com/watch?v=itaMNuWLzJo


Передбачуваність! = Повторення. Мерсенн Твістер є хорошим прикладом цього. У більшості реалізацій після 624 Int32 можна передбачити все наступне число, але послідовність Mersenne Twister набагато довша за це (2 ^ 19937 - 1).
HoLyVieR

Я не розумію, чому ця відповідь не підштовхується, оскільки мені здається, що це точна і лаконічна відповідь на питання, принаймні частково. Псевдо випадкові числа можна легко передбачити після деяких малюнків, кількість малюнків змінюється залежно від алгоритму псевдовипадкових алгоритмів «якість». Вибір алгоритму "хорошого" розглядає аспекти: 1. кожне значення виводиться з однаковою частотою (розподіл), 2. потрібно "тривалий час", щоб перезапустити послідовність на початку та знову почати малювати ті самі числа в той самий порядок.
хвилини

"справжні випадкові числа не [передбачувані]". На сьогодні це правда. Тепер, якщо ми віримо в теорію Великого вибуху, і у нас є багато сил для обчислення стану Всесвіту в будь-який час після ВВ, виходячи з фізики, то ... ми можемо передбачити майбутнє, включаючи той факт, що Я пишу цей дуже точний коментар. Правильно?
хвилини

Це гіпотетично вірно, однак, враховуючи величезний ступінь ентропії, що бере участь у реальних діях реальних тіл, необхідна обчислювальна потужність була б смішно величезною. Подумайте, континенти, які охоплені комп’ютерами. Крім того, через залежність від попереднього стану, стан кожного тіла у Всесвіті в кожний момент часу потрібно було б зберігати, що за визначенням вимагатиме більше місця, ніж є у Всесвіті, повністю наповненого апаратом пам'яті
TheEnvironmentalist

@TheEnvironmentalist - Ах! "Континенти, покриті комп'ютерами" ... хіба це не те, що "Посібник з автостопом до Галактики"? ;-)
ysap

10

Припустимо, що псевдо випадкове число може здогадатися будь-хто, перш ніж воно генерується.

Для тривіальних додатків псевдо випадковість прекрасна, так як у вашому прикладі ви отримаєте приблизно правильний відсоток (приблизно 1/6 частини загального набору результатів) з деякими незначними варіаціями (що ви побачили, якби котити кістки 600k разів);

Однак, якщо мова йде про такі речі, як комп'ютерна безпека; Потрібна справжня випадковість.

Наприклад, алгоритм RSA починається з вибору комп'ютером двох випадкових чисел (P і Q), а потім виконує кілька кроків до цих чисел для створення спеціальних чисел, відомих як ваші відкриті та приватні ключі. (Важливою частиною приватного ключа є те, що він приватний, і його ніхто не знає!)

Якщо зловмисник може знати, які два "випадкові" номери, які вибирає ваш комп'ютер, вони можуть зробити ті ж самі кроки, щоб обчислити ваш приватний ключ (той, якого ніхто більше не повинен знати!)

За допомогою приватного ключа зловмисник може робити такі речі, як а) Поговоріть зі своїм банком, роблячи вигляд, що ви, б) прослуховуйте свій "безпечний" інтернет-трафік і зможете його розшифрувати; в) маскуватися між вами та іншими сторонами в Інтернеті.

Ось де потрібна справжня випадковість (тобто неможливо здогадатися / обчислити).


10

Перше випадкове число, яке я коли-небудь використав, мав чудову властивість будь-яких двох послідовних випадкових чисел, друге було більшим з вірогідністю 0,6. Не 0,5. І третій був більший за другий з вірогідністю 0,6 тощо. Ви можете собі уявити, як це грає хаос за допомогою симуляції.

Деякі люди не повірять мені, що це навіть можливо, якщо випадкові числа розподіляються однаково, але, очевидно, це можливо, якщо подивитися на послідовність (1, 3, 5, 2, 4, 1, 3, 5, 2, 4, ...) де друге з двох чисел більше з вірогідністю 0,6.

З іншого боку, для моделювання може бути важливим вміння відтворювати випадкові числа. Скажімо, ви виконуєте імітацію трафіку і хочете з’ясувати, як деякі дії, які ви могли б вжити, могли б покращити трафік. У такому випадку ви хочете мати можливість знову створити такі самі дані про трафік (як люди, які намагаються в'їхати в місто) за допомогою різних дій, які ви намагалися покращити трафік.


8

Коротка відповідь полягає в тому, що зазвичай люди вимагають «справжньої випадковості» з поганої причини, а саме, що вони не розуміють криптографії.

Криптографічні примітиви, такі як шифри потоку та CSPRNG , використовуються для отримання величезних потоків непередбачуваних бітів, після того, як вони будуть подані декількома непередбачуваними бітами.

Тепер уважний читач зрозумів, що тут є проблема завантаження: ми повинні зібрати кілька біт ентропії, щоб почати все. Тоді be може подати їх до CSPRNG, який, у свою чергу, із задоволенням надасть усі необхідні нам непередбачувані шматочки. Таким чином, для встановлення CSPRNG необхідний апаратний RNG . Це єдиний випадок, коли ентропія потрібна правдиво.

(Я думаю, це повинно було бути розміщено в розділі "Безпека" або "Криптографія".)

Редагувати: Зрештою, потрібно вибрати генератор випадкових чисел, який достатньо хороший для розробленої задачі, а що стосується генерації випадкових чисел, апаратне забезпечення не обов'язково прирівнюється до хорошого. Як і погані PRNG, апаратні випадкові джерела зазвичай мають упередження.

Редагувати: Деякі люди припускають модель загрози, в якій зловмисник міг прочитати внутрішній стан CSPRNG і звідси дійти висновку, що CSPRNG не є безпечним рішенням. Це приклад поганого моделювання ниток. Якщо зловмиснику належить ваша система, гра закінчена, проста і проста. Незалежно від того, використовуєте ви в даний момент TRNG або CSPRNG.

Редагувати: Отже, підсумовуючи все це ... Ентропія потрібна для насіння CSPRNG. Коли це буде зроблено, CSPRNG надасть всі непередбачувані біти, необхідні нам для програм безпеки набагато швидше, ніж ми можемо (як правило) збирати ентропію. Якщо непередбачуваність не потрібна, наприклад, для моделювання, Mersenne Twister надасть числа з хорошими статистичними властивостями зі значно більшою швидкістю.

Редагувати: Усі, хто бажає зрозуміти проблему безпечного генерування випадкових чисел, повинні прочитати це: http://www.cigital.com/whitepapers/dl/The_Importance_of_Reliable_Randomness.pdf


2
Це не обов'язково питання безпеки. Я думаю, що є причини використовувати справді випадкові числа, які не передбачають безпеки. Якби я робив якісь наукові дослідження, які залежать від випадкових чисел, і з будь-якої причини було важливо, щоб цифри були максимально випадковими, я, безумовно, скористався апаратним RNG, щоб я був впевнений, що будь-які властивості, які спостерігаються, не належать до примх RNG.
Кеф Шектер

3
@KefSchecter Це їхні чуті апаратні PRNG, як правило, мають упереджений та / або корельований вихід. Їм потрібен крок після обробки, щоб перетворити його на рівномірний незалежний вихід. Немає підстав вважати, що цей крок після обробки більш надійний, ніж сучасний потіковий шифр. Я, звичайно, більше би довіряв шифру потоку. Як додатковий бонус він відтворюється, що є цінним для науки.
CodesInChaos

Гаразд, досить справедливо. Але хіба те ж саме не стосується програм криптографії? Навіть відповідь gievn тут говорить, що вам потрібен апаратний RNG, щоб викласти CSPRNG.
Kef Schecter

2
@KefSchecter Так, криптовалютам потрібні справжні випадкові числа, щоб запустити CSPRNG. Але для всього іншого ми можемо використовувати цю CSPRNG.
CodesInChaos

@KefSchecter: Криптографічні програми вимагають, щоб потік не був відтворений світом в цілому. Навпаки, у наукових програмах корисність того, щоб показати, що "випадкові" числа, які використовуються, були не просто обрані для того, щоб показати аналіз в хорошому світлі. Наприклад, якщо оголосити після оголошення своїх методів, що вони будуть генерувати дані певним чином, використовуючи державні номери лотереї на наступний день, читачі можуть бути дещо впевнені, що не піддаються результатам, навіть якщо малюнок у будній день має лише пару десятків біти ентропії.
supercat

7

Не всі PRNG підходять для будь-якого використання. Наприклад, Java.util.SecureRandom використовує хеш SHA1, який має вихідний розмір 160 біт. Це означає, що є 2 160 можливих потоків випадкових чисел, які можуть виходити з нього. Просто як це. Ви не можете отримати більше 2 160 значень внутрішнього стану. Таким чином, ви не можете отримати більше 2 160 унікальних потоків випадкових чисел з одного насіння, незалежно від того, звідки ви походили. Вважається, що Windows CryptGenRandom використовує 40-байтний стан, він має 2 320 можливих потоків випадкових чисел.

Кількість способів переміщення стандартної колоди на 52 картки становить 52 !, що становить приблизно 2 226 . Таким чином, незалежно від посіву, ви не можете використовувати Java.util.SecureRandom для переміщення колоди карт. Існує приблизно 2 66 можливих перебоїв, які він не може створити. Звичайно, ми не знаємо, які вони ...

Отже, якби у мене було джерело, скажімо, 256 біт справжньої випадковості (наприклад, з картки Quantis RNG), я міг би засіяти PRNG, як CryptGenRandom () з цим насінням, а потім використати PRNG для переміщення колоди картки. Якщо я переспробував із справжньою випадковістю кожне перетасування, це буде добре: непередбачувано та статистично випадково. Якби я зробив те ж саме з Java.util.SecureRandom, не було б можливого вироблення перетасовок, оскільки воно не може бути засіяне 256 бітами ентропії, і його внутрішній стан не може представляти всі можливі перетасування.

Зауважте, що результати java.util.SecureRandom були б непередбачуваними та статистично випадковими. Жоден статистичний тест ніколи не визначить проблему! Але вихід RNG недостатньо великий, щоб охопити повний домен усіх можливих виходів, необхідних для імітації колоди карт.

І пам’ятайте, якщо додати джокерів, це 54! що вам доведеться покрити, що вимагає приблизно 2 238 можливостей.


2
Чому ви переймаєтесь тим, що деякі перебої не можуть відбутися? Це обмеження не має спостережуваної дії.
CodesInChaos

2
Мене начебто запитують. Для сильно регульованих ігрових компаній такий ухил математично доводить, що ваші шанси виграти в карткові ігри відрізняються від комп'ютера, ніж з паперовою колодою карт. Не має значення, шанси кращі чи гірші. Вони РІЗНІ. Комп'ютер не є морально еквівалентним справжній колоді. Більше того, ми не можемо охарактеризувати різницю. Ігрова компанія, яка загрожує жорсткими регуляторними штрафами, дуже піклується.
Paco Hope

1
Але це виявляється. Я виявляю його за допомогою відомого процесу: огляд вихідного коду та знання проблемної області. Ось що примітно. Я НЕ можу використовувати автоматизований статистичний аналіз. Це так само помітно, як і хтось, хто використовує java.util.Random або Mersenne Twister. Статистичний аналіз - не єдиний дійсний механізм виявлення невідповідності RNG / проблемної доменної області. Збої, які передають цей детектор, за визначенням не є успіхом.
Пако Надія

1
Я ніколи не погоджувався з цим твердженням. Я сказав, що статистичний аналіз не є непогрішним доказом того, що RNG / PRNG є правильним. Це приклад хибного негативу. Це має бути неправильним, але тест статистичного виходу пройде його. Якщо я використовую SHA1 (1), SHA1 (2), SHA1 (3) ... SHA1 (n) як "RNG", який також пройде статистичні тести. Це також неправильно. Визначення правильності виходить за межі визначення "проходить статистичні тести". Проходження статистичних тестів необхідно, але недостатньо.
Paco Hope

4
@CodesInChaos: Аргумент "ми не знаємо нападу, який може скористатися тим фактом, що переважна більшість можливих перебоїв IRL ніколи не буде вироблятися" не означає, що така атака неможлива, просто що ми робимо Я не знаю, що це таке, або як його захистити. Правильне ставлення в такому випадку полягає у усуненні можливості нападу, усуваючи умову: зробіть РНГ достатньої якості, щоб він насправді міг генерувати кожну можливу колоду.
Ерік Ліпперт

6

Псевдовипадкові числа генеруються за допомогою математичної функції та початкового значення (називається початковим ), тоді як випадкові числа - ні. Їх передбачуваність робить їх надзвичайно корисними для повторень гри, оскільки вам потрібно лише зберегти насіння та дані гравця - AI буде реагувати точно таким же «випадковим» способом щоразу.


6

Різниця між "справжнім" випадковим і "псевдо" випадковим числом - це передбачуваність. Цю відповідь уже надано.

Однак передбачуваність не обов'язково є поганою справою, як показує більшість прикладів. Ось практичний приклад одного з рідкісних випадків, коли передбачуваність хороша: Глобальна система позиціонування.

Кожен супутник використовує чіткий PRN-код ( коди Голд ), придатний для автоматичної кореляції або перехресної кореляції, необхідної для вимірювання часу поширення сигналу. Для цих кодів Голда кореляція між собою особливо слабка, що дозволяє однозначно ідентифікувати супутник, але дозволяє проводити обчислення відстані за допомогою кореляції між випромінюваною послідовністю та приймачем.


2

Для швидкої перевірки випадковості ви берете точки з випадковими координатами в [0; 1), після чого поміщаєте їх у k-мірний куб. Тоді ви робите процедуру розрізання цього куба на підкуби - кожен об'єм субкуба (або субсфери) повинен бути виміряний правильно цією процедурою з коливаннями згідно з відомою теоремою.

Якість випадковості важлива там, де ви зустрічаєтесь ...

  1. цілі безпеки. Коли ви генеруєте число для використання в якості параметра для свого генерації ключів, і це цілком передбачувано - ворог дізнається це зі 100% вірогідністю і зробить поле для пошуку набагато меншим.

  2. наукові цілі. У науці ви маєте не тільки мати середню середню величину в хорошому стані, але також слід усунути співвідношення між різними випадковими числами. Отже, якщо взяти (a_i - a) (a_ {i + 1} -a) і знайти його розподіл, він повинен відповідати статистиці.

Парна кореляція називається "слабкою випадковістю". Якщо ви хочете реальної випадковості, ви повинні мати кореляцію високого порядку з більш ніж двома варіаціями.

Сьогодні лише генератори квантової механіки забезпечують справжню випадковість.


1

Чому важлива справжня випадковість?

В основному є дві основні причини, чому потрібна справжня випадковість:

  1. Якщо ви використовуєте RNG для криптографії (включаючи такі речі, як гра в реальні гроші та проведення лотереї), то PRNG зробить вас циферблатом набагато слабкішим, ніж математичний аналіз його (який передбачає TRNG), ви б повірили. PRNG насправді не буде випадковим, але матиме закономірність - супротивники можуть використовувати цей шаблон, щоб зламати шифр, який повинен був бути неможливим.
  2. Якщо ви використовуєте RNG для імітації "випадкових" входів, наприклад для тестування помилок або моделювання, то PRNG робить ваш підхід слабким. Коли ви не виявите жодних помилок, завжди буде виникати той нудний сумнів: чи є помилка, яка не помітна за схемою мого PRNG, але виявилася б, якби я використовував лише TRNG? Чи точно опис моєї симуляції описує реальність, чи це явище, яке я виявив, просто артефакт схеми PRNG?

Поза цих областей це насправді не має значення. Caveat: Якщо ваш PRNG дуже-дуже поганий, він все ще може бути непридатним - ви не хочете робити гру в Craps, де кістки завжди з'являються навіть, вашим гравцям це не сподобається.

Як PRNG Python недостатньо хороший?

Дуже ймовірно, що ви зможете виявити підводні камені справжнього ПРНГ за допомогою такої простої методології. Статистичний аналіз РНГ - сама по собі наукова наука, і деякі надзвичайно складні тести доступні для визначення «випадковості» алгоритму. Вони набагато досконаліші, ніж ваша проста спроба.

Кожен розробник програмного забезпечення, який створює бібліотеки реального світу, такі як розробники Python, використовує ці статистичні тести як мірку, щоб переконатися, чи достатньо їх реалізація PRNG. Тож, за винятком випадків фактичного нагляду за розробниками, дуже малоймовірно, що ви зможете легко виявити візерунок у реальному PRNG. Це не означає, що немає шаблону - PRNG має шаблон за визначенням.


0

В основному, ви не можете довести, що джерело є випадковим шляхом математичного аналізу виходу, вам потрібна наприклад фізична модель, яка говорить, що джерело є випадковим (як у радіоактивному розпаді).

Ви можете просто запустити пакетні тести, щоб знайти статистичну кореляцію у вихідних даних; у цьому випадку дані виявляються невипадковими (але також випадкове джерело може мати невипадкові виходи, або воно не буде справді випадковим, якщо воно не може дати конкретні вихід). В іншому випадку, якщо тести будуть здані, ви можете сказати, що дані є псевдовипадковими.

Проходження деяких тестів на випадковість означає, що у вас є хороший PRNG (псевдогенератор випадкових чисел), який може бути корисним для програм, де безпека не задіяна.

Якщо йдеться про безпеку (тобто шифрування, генерування ключової солі, генерація випадкових чисел для азартних ігор ...), недостатньо мати хороший PRNG, він повинен мати додаткові якості, як, наприклад, виведення функції не легко вгадати з попередніх результатів, функція повинна мати бажану обчислювальну вартість (достатньо обмежена, щоб бути зручною для використання, але достатньо високою, щоб перемогти грубі спроби змушування), апаратне забезпечення, яке виконує цю функцію, - або пристрій, у сьогоднішньому випадковому випадку це аналоговий пристрій - не повинно легко підроблятися тощо.

Маючи хороший PRNG може бути корисним в іграх для створення нових і непередбачуваних шаблонів, а також в шифруванні - занадто громіздко, щоб пояснити в одному дописі, просто подумайте як роль великого пальця, що вихід із процедури шифрування повинен бути псевдовипадковим, не показуючи зразки які можуть співвідносити попередні зашифровані дані з наступними зашифрованими даними, або пов’язати дані простого тексту із зашифрованими даними, або пов'язати два різних шифротексти один з одним (так що можна зробити здогадки на простих текстах) ....


-4

Коротка розповідь:

Створює випадкове насіння за допомогою поточної мікросекунди системи.

Ця хитрість досить стара і досі функціональна.

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

Скажімо, наприклад, я можу визначити використане насіння, використовуючи лише 10 значень. Отже, знаючи насіння, я можу здогадатися про наступне значення.

Якщо я використовую насіння = 1, я можу отримати наступну послідовність:

1, 2, 3, 4, 5, 6, 7, 8, 9 ... (і я вважаю, що насіння використовувало id 1 і наступне значення 10)

Але що буде, якщо змінити відправити кожне "n-е" значення ?. Зміна насіння поточними мікросекундами - дешевий трюк (тобто для нього не потрібно багато циклів процесора).

Отже, послідовність тепер така: (насіння = 1) 1, 2, 3, 4, 5, (насіння = 2), 7, 9, 11, 13 ... (15?)

В цьому випадку:

а) Я не можу визначити, яке насіння було використано.

б) Ерго, я не можу здогадатися про наступне значення.

c) Єдина здогадка, яку я можу зробити, - це вирахувати, що наступне насіння може бути основним числом.

У будь-якому випадку, більшість сучасних алгоритмів випадкових генераторів вже використовують цей трюк під кришкою.

Справжній факт полягає в тому, що нам не потрібен квантовий комп'ютер для створення "справжнього" випадкового числа, неточність кварцового кристала нашого комп'ютера виступає генератором випадкових випадків, також випадкова ефективність нашого процесора також мінлива без врахування що процесор зазвичай виконує одночасно кілька завдань.


2
Це досить погана ідея, і це джерело вразливості для речі, для якої потрібна справді непередбачувана послідовність. Якщо ви займаєте мікросекунди, у вас є лише 10 ^ 6 можливостей насіння, що є досить низьким.
HoLyVieR

@HoLyVieR: це, звичайно, погана ідея, якщо ви дбаєте про безпеку, але не настільки погано, як ви робите: ви зазвичай використовуєте мікросекунди з моменту запуску системи (або епоха Unix ....), що значно збільшує діапазон можливих значень.
mikera

1
@mikera Це не краще, час, коли запит був оброблений, передбачуваний. Це вектор уразливості для великої кількості функцій скидання пароля. Ці сценарії генерували "випадковий" маркер з вашою технікою, і зловмисник міг знайти маркер, згенерований з моменту знаходження часу, в який він був виконаний, досить тривіально ... це той самий час, коли запит на скидання пароля було надіслано + - 150 мс.
HoLyVieR

Звичайно, така ситуація дуже погана. Але ситуація, коли держава була засіяна під час запуску системи, а зловмисник не вдається гадати час запуску, не така вже й погана. Ви можете легко вибрати 10 ^ 12 можливих мікросекунд на вибір, що може зробити деякі види атаки нездійсненними. Щоб було зрозуміло: з цих криптовалют усі ці рішення досить погані, але постійні мають значення .
mikera

Для інтернет-серверів інформація про час роботи системи інколи пропонується публічно. Або ви можете отримати його на сторінці статусу "Інциденти. Сервер знову.". Або ви можете пінгувати, чекати великого простою і зауважити, що це може бути перезавантаження машини (що дасть кілька сотень мільйонів часу на перевірку, що досить мало).
Дерексон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.