Парадокс до дня народження, або те, чому PRNG продукують дублікати частіше, ніж ви думаєте.
У проблемі ОП є кілька питань. Один - парадокс дня народження, як згадувалося вище, а другий - характер того, що ви створюєте, що за своєю суттю не гарантує, що дане число не повториться.
Парадокс дня народження застосовується там, де дане значення може траплятися більше одного разу протягом періоду генератора - і, отже, дублювання може відбуватися в межах вибірки значень. Ефект Парадоксу до дня народження полягає в тому, що реальна ймовірність отримання таких дублікатів досить значна, і середній період між ними менший, ніж можна було б подумати. Цей дисонанс між сприйнятою та реальною ймовірністю робить Парадокс до дня народження хорошим прикладом когнітивного упередження , де наївна інтуїтивна оцінка, ймовірно, буде дико неправильною.
Швидкий посібник з генераторів випадкових чисел псевдо (PRNG)
Перша частина вашої проблеми полягає в тому, що ви приймаєте значення експонента генератора випадкових чисел і перетворюєте його в набагато менше число, тому простір можливих значень зменшується. Хоча деякі генератори псевдовипадкових чисел не повторюють значень протягом свого періоду, це перетворення змінює домен на значно менший. Менший домен анулює умову "заборони повторення", тому ви можете очікувати значної ймовірності повторень.
Деякі алгоритми, такі як лінійний конгруентний PRNG ( A'=AX|M
) , гарантують унікальність протягом усього періоду. У LCG сформоване значення містить весь стан акумулятора, і додатковий стан не зберігається. Генератор детермінований і не може повторити число протягом періоду - будь-яке задане значення накопичувача може означати лише одне можливе послідовне значення. Отже, кожне значення може відбуватися лише один раз протягом періоду генератора. Однак період такого PRNG порівняно невеликий - близько 2 ^ 30 для типових реалізацій алгоритму LCG - і не може бути більшим за кількість різних значень.
Не всі алгоритми PRNG поділяють цю характеристику; деякі можуть повторити задане значення протягом періоду. У задачі OP алгоритм Мерсенна Твістера (використовуваний у випадковому модулі Python ) має дуже довгий період - набагато більший за 2 ^ 32. На відміну від лінійного конгруентного PRNG, результат не є чисто функцією попереднього вихідного значення, оскільки накопичувач містить додатковий стан. При 32-бітному цілочисельному виведенні та періоді ~ 2 ^ 19937 він не може надати таку гарантію.
Mersenne Twister - популярний алгоритм для PRNG, оскільки він має хороші статистичні та геометричні властивості та дуже тривалий період - бажані характеристики для PRNG, що використовується на імітаційних моделях.
Хороші статистичні властивості означають, що числа, породжені алгоритмом, розподіляються рівномірно, при цьому жодні числа не мають значно більшої ймовірності появи, ніж інші. Погані статистичні властивості можуть призвести до небажаних перекосів у результатах.
Хороші геометричні властивості означають, що набори з N чисел не лежать на гіперплощині в N-мірному просторі. Погані геометричні властивості можуть генерувати помилкові кореляції в імітаційній моделі та спотворювати результати.
Довгий період означає, що ви можете генерувати багато чисел до того, як послідовність обернеться до початку. Якщо модель потребує великої кількості ітерацій або її потрібно запускати з кількох насінин, тоді 2 ^ 30 або близько того дискретних чисел, доступних у типовій реалізації LCG, може бути недостатньо. Алгоритм MT19337 має дуже довгий період - 2 ^ 19337-1, або приблизно 10 ^ 5821. Для порівняння загальна кількість атомів у Всесвіті оцінюється приблизно в 10 ^ 80.
32-бітове ціле число, створене PRNG MT19337, не може представляти достатньо дискретних значень, щоб уникнути повторення протягом такого великого періоду. У цьому випадку повторювані значення можуть виникнути і неминучі при достатньо великій вибірці.
Парадокс до дня народження в двох словах
Ця проблема спочатку визначається як ймовірність того, що будь-які дві людини в кімнаті матимуть один день народження. Ключовим моментом є те, що будь-які двоє людей у кімнаті могли б поділити день народження. Люди, як правило, наївно неправильно трактують проблему як ймовірність того, що хтось із присутніх проводить день народження з конкретною людиною, що є джерелом когнітивних упереджень, які часто змушують людей недооцінювати ймовірність. Це неправильне припущення - немає вимоги, щоб збіг ставився до конкретної особи, і будь-які дві особи могли б збігатися.
Імовірність збігу між будь-якими двома особами набагато вища, ніж ймовірність збігу з конкретною особою, оскільки збіг не повинен бути до певної дати. Швидше, вам доведеться знайти лише двох осіб, які мають однаковий день народження. З цього графіку (який можна знайти на сторінці Вікіпедії з цього приводу) ми бачимо, що нам потрібно лише 23 людини в кімнаті, щоб було 50% шансів знайти двох, які збігаються таким чином.
Зі статті Вікіпедії на цю тему ми можемо отримати гарне резюме. У проблемі OP ми маємо 4500 можливих «днів народження», а не 365. Для заданої кількості випадкових значень, що генеруються (що дорівнює «людям»), ми хочемо знати ймовірність появи будь-яких двох однакових значень у послідовності.
Обчислення ймовірного впливу Парадоксу до дня народження на проблему ОП
Для послідовності із 100 чисел ми маємо
пари (див. Розуміння проблеми ), які потенційно можуть збігатися (тобто перше може збігатися з другим, третім тощо, друге може збігатися з третім, четвертим тощо тощо), тому кількість комбінацій, які потенційно можуть збігатися, перевищує лише 100.
З обчислення ймовірності ми отримуємо вираз
. Наступний фрагмент коду Python нижче наївно оцінює ймовірність виникнення пари, що відповідає.
from math import log10, factorial
PV=4500
SS=100
numerator = factorial (PV)
denominator = (PV ** SS) * factorial (PV - SS)
log_prob_no_pair = log10 (numerator) - log10 (denominator)
print 1.0 - (10 ** log_prob_no_pair)
Це дає розумний результат p = 0,669 для збігу, що відбувається в межах 100 чисел, відібраних із сукупності 4500 можливих значень. (Можливо, хтось міг це перевірити та залишити коментар, якщо це неправильно). З цього ми бачимо, що довжина пробігів між відповідними числами, що спостерігаються OP, здається цілком розумною.
Виноска: використання перетасовки для отримання унікальної послідовності псевдовипадкових чисел
Дивіться цю відповідь нижче від С. Марка щодо засобів отримання гарантованого унікального набору випадкових чисел. Техніка, на яку посилається плакат, приймає масив цифр (які ви надаєте, щоб ви могли зробити їх унікальними) і перемішує їх у випадковий порядок. Малювання чисел послідовно з перетасованого масиву дасть вам послідовність псевдовипадкових чисел, які гарантовано не повторяться.
Виноска: Криптографічно захищені PRNG
Алгоритм МТ не є криптографічно безпечним, оскільки порівняно легко зробити висновок про внутрішній стан генератора, спостерігаючи послідовність чисел. Інші алгоритми, такі як Blum Blum Shub , використовуються для криптографічних програм, але можуть бути непридатними для моделювання або загальних додаткових випадкових чисел. Криптографічно захищені PRNG можуть бути дорогими (можливо, вимагатимуть обчислень бінгума) або можуть не мати хороших геометричних властивостей. У випадку з цим типом алгоритму основна вимога полягає в тому, що обчислювально неможливо зробити висновок про внутрішній стан генератора, спостерігаючи послідовність значень.