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


47

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

У ньому є наступний абзац, який я повністю не в змозі зрозуміти.

На жаль, генерувати випадкові числа виглядає набагато простіше, ніж є насправді. Дійсно, неможливо створити справді випадкові числа на будь-якому детермінованому пристрої. Фон Нойман [Neu63] сказав, що найкраще: "Кожен, хто розглядає арифметичні методи отримання випадкових цифр, звичайно, знаходиться в гріху". Найкраще, на що ми можемо сподіватися, - це псевдовипадкові числа, потік чисел, якщо вони були породжені випадковим чином.

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


86
Ви справді запитуєте, чому ви не можете створити дійсно випадкове число на детермінованому пристрої? Чи не запитання вже містить відповідь?
herby

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

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

13
Поза комп'ютером, чи справді випадкове число є справді випадковим? Киньте штамп, це фізика з дуже великою кількістю векторів.
MPelletier

9
@MPelletier: Не зовсім. Квантова механіка (як тільки вчені розібралися з цим більше) передбачає існування справжньої випадковості, залежно від вашого визначення випадковості.
Брайан

Відповіді:


65

Слід шукати криптографічно захищений генератор псевдовипадкових чисел . Більшість PRNG є генераторами лінійної конгруенції (так next numberце лінійна функція previous number), тож якщо ви побудуєте графік next numberпроти, previous numberви отримаєте діаграму паралельних ліній. CSPRNG цього не зробить. Вигода полягає в тому, що вони повільні.

Я групую генератори випадкових чисел у 3 категорії :

  1. Досить добре для домашніх завдань.
  2. Досить добре, щоб зробити ставку на вашу компанію.
  3. Досить добре, щоб зробити ставку на свою країну.

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

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


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

2
@ user973810 Проблема з цим визначенням з теорії інформації полягає в тому, що ви не можете демонструвати фактичний екземпляр випадкової послідовності. Ми можемо довести для будь-якої мови розумного визначення, що майже кожна нескінченна послідовність (у технічному розумінні) є випадковою, оскільки її взагалі неможливо описати мовою. Більш корисною є концепція генератора випадкових послідовностей: не тієї, яка виробляє випадкову послідовність, а тієї, яка виробляє послідовність випадковим чином.
Жил 'ТАК - перестань бути злим'

13
Незначна нітрик: деякі люди, а саме фізики з ядерних ядер і частинок, цілком впевнені, що такі процеси, як атомний розпад , справді випадкові.
David Z

9
@David: Ми можемо зайти трохи далі, ніж це навіть. Різні експерименти з нерівністю Белла показують, що певні квантові процеси остаточно непередбачувані . Вони можуть бути випадковими в якомусь філософському сенсі або можуть залежати від не локальних прихованих змінних, але будь-який випадок заважає надійному прогнозуванню.
dmckee

7
@dmckee: Так, я просто зрозумів, що буде легше триматися осторонь від спроб пояснити зв’язок між нерівністю Белла та крахом хвильової функції в коментарях до prog.SE. Люди завжди можуть зайти на наш сайт, якщо їм цікаво ;-) Тангурена: правда, Ейнштейн це сказав, але це просто означало, що він справді хотів, щоб Всесвіт була детермінованою. Це не все-таки. Експерименти, проведені після смерті Ейнштейна, показали, що це досить переконливо (забороняючи не локальні приховані змінні, відомі також дивацтвом ). Тільки тому, що він Ейнштейн, це не означає, що він мав рацію у всьому.
David Z

22

Справжня випадковість передбачає недетермінізм. Якщо це детерміновано, його можна точно передбачити (ось що означає детермінізм); якщо це можна передбачити, це не випадково.

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

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

Інший загальний підхід полягає в тому, щоб визначити поточний час як насіння для детермінованого СПГ ( srand(time(NULL));в С); Криптографічно кажучи, це марно, оскільки поточний час не є секретом, але для таких речей, як фізичні симуляції чи відеоігри, це досить добре.


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

@ 9000: Звичайно, це неправда. Вживайте нераціональну кількість використання цифр (будь-якої бази) як "випадкової" послідовності. Бум! неповторювана послідовність (за визначенням) і все ще обмежена (до вашої бази).
ThePopMachine

@ThePopMachine: ви можете створити неповторювану послідовність бітів будь-якої довжини, еквівалентну неповторюваній послідовності чисел необмеженої довжини. Ви не можете генерувати повторювані послідовності цілих чисел обмеженої величини (наприклад, 32-розрядні); як тільки ви створили всі перестановки 32-бітних значень, послідовність повинна повторюватися. Ти правий; ми просто говоримо про різні речі.
9000

@ 9000: Немає вільного користування. Ви зробили бланк твердження, яке неправдиво. Якщо ви справді просто намагаєтесь, щоб не більше n ^ k різних послідовностей довжини k для n різних значень, і тому це повинно повторюватися, то це досить очевидно і не цікаво.
ThePopMachine

2
@ThePopMachine: Буду вдячний, якби ти трохи пом'якшив. Цитувати, «неповторний також неможливий для будь-якого генератора з обмеженим вихідним значенням (обмежена кількість біт)». Те, про що ви прямо говорите, - це необмежена кількість бітів, як послідовність [двійкових] цифр ірраціонального числа. Ваша заява, правда, не пов'язана з проблемою.
9000

10

Другий розділ книги « Моделювання дискретних подій: перший курс Лоуренса Леміса» дає фантастичне вступ до генераторів випадкових чисел (а точніше - генераторів випадкових чисел псуедо).

Уривок з його книги добре це пояснює на мою думку:

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

  • випадковий - здатний отримати вихід, який проходить усі розумні статистичні тести на випадковість;
  • керований - здатний відтворювати свій вихід, за бажанням;
  • портативний - здатний виробляти однаковий вихід на найрізноманітніших комп'ютерних системах;
  • ефективний - швидкий, з мінімальними потребами в комп'ютерних ресурсах;
  • задокументовано - теоретично проаналізовано та широко перевірено.

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

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


7

Тому що вам потрібно написати код для генерації випадкових чисел, а код НЕ є випадковим. (Це детерміновано)

Таким чином, ви закінчуєте, починаючи з "Значень (-ів) насіння", які вибираються в "Випадково" (зазвичай це поточна часова марка), потім використовуєте його в алгоритмі для початку генерації чисел. Але весь набір заснований на вихідному значенні насіння!

Отже, якщо ви знову запустите свій код із точно такими ж значеннями Seed (s), ви отримаєте ТОЧНИЙ той самий набір чисел! Як будь-хто розумно може назвати це випадково? Але це, звичайно, ДУЖЕ випадково.


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


13
З іншого боку, повторювані псевдовипадкові числа можуть бути чудовими для налагодження.
Девід Торнлі

5

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


1
Це справді коментар, а не відповідь, оскільки він насправді не відповідає на питання .
Марк Бут

5

У мене дуже просте визначення псевдослучайності :

Занадто багато невідомих змінних для передбачення.

У мене також є просте визначення True Random :

Нескінченні невідомі змінні.

Проблема з комп’ютером полягає в тому, що він завжди знає ВСІ змінні. Випадкове число - це просто математична функція деякого значення насіння .
Найкраще, що ми можемо зробити, - це надати комп'ютеру псевдовипадкове значення насіння, яке, як правило, засноване на змінній, яку ми не можемо передбачити (наприклад, точний час).

Незважаючи на те, що комп'ютер абсолютно не в змозі створити випадкове число, добре ввести занадто багато змінних для прогнозування!


1
Ну "час" - це поганий приклад того, чого неможливо передбачити. Рух миші, введення мікрофона тощо з іншого боку - це вхід, який не передбачуваний.
HoLyVieR

3

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

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


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

@DavidThornley, ... поки хтось не з'ясує формулу.
CaffGeek

1
@Chad: Формули у звичайному сенсі немає; це було виключено експериментами EPR. Звичайно, можливо, що це все детерміновано, але не будь-яким легко зрозумілим способом.
Девід Торнлі

@DavidThornley, я знав, що це неправильне слово. Я думаю, ми знаємо, що я намагався сказати. Майже щоразу, коли хтось каже, що щось неможливо, хтось ізрештою доводить їх неправильно. Це людська природа.
CaffGeek

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

2

Немає можливості створити випадкове число без спеціального обладнання. У першокурснику я пару однокласників запропонував генератор випадкових чисел, який, в основному, приймач АМ і налаштований на 4 різні канали, отримують вхід у перетворювач від A до D і додають їх усі (з урахуванням вашої максимальної кількості). Оскільки комбінація аналогового вводу з будь-якої довільної кількості станцій є випадковою, і ми могли б створити велику кількість випадкових чисел з перетворювача A2D, що ми запропонували, це може бути хорошим генератором. Звичайно, навіть це не є справді випадковим у філософському розумінні, хоча для більшості практичних цілей це може спрацювати.


2

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

Отже, якщо f (x) = z, f (x)! = Y, якщо y не z. Це функція. Уявіть JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Незалежно від того, скільки разів ви викликаєте, Add(2,3)він завжди повертається 5. Іншими словами, Add () - це детермінована функція.

Зовнішні фактори можуть змусити Add поводитися недетерміновано. Наприклад, якщо ви введете в рівняння багатопотоковість. Людський внесок також викликає недетермінізм.

Зараз тут стають цікаві речі.

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

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

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

Автор цитування робить це на крок далі.

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

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

Можна міркувати про значення недетермінізму. Знову ж таки, tangetenial. Запам’ятайте контекст.

Значить, він правильний. На будь-якому детермінованому пристрої детермінованій системі неможливо створити справжній випадковий результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.