Загальна кількість можливостей
1) Закрий! У вас 62 варіанти для першого персонажа, 62 для другого тощо, так що ви закінчите62⋅62⋅62⋅⋯62=6220, що є абсурдно величезною кількістю.
Зіткнення з рядком "Ціль"
2) Як ми встановили вище, є 6220потенційні рядки. Ви хочете знати, скільки вам потрібно буде здогадуватися, щоб мати кращий показник 1 на 100 000 шансів на вгадування рядка "target". По суті, ви запитуєте, що
x6220≥1105
Щоб вимкнути це місце, вам доведеться округлити х (або додати його, якщо вони точно рівні), але як ви побачите через секунду, це насправді не має значення.
За допомогою основної алгебри ми можемо переставити це як
105x105x105xx≥6220≥(6.2⋅10)20≥6.220⋅1020≥6.220⋅1015
Виконуючи математику, 6.220 є про 7⋅1015, тому назвемо всю справу 7⋅1030 або, що більш лаконічно, цілий чорт багато.
Це, звичайно, чому довгі паролі працюють дуже добре :-) Що стосується справжніх паролів, звичайно, ви повинні турбуватися про рядки довжиною менше або дорівнює двадцяти, що збільшує кількість можливостей ще більше.
Дублікати у списку
Тепер розглянемо інший сценарій. Рядки генеруються випадковим чином, і ми хочемо визначити, скільки їх можна створити, перш ніж є шанс 1: 100 000 для будь-яких двох рядків. Класична версія цієї проблеми називається «Проблема з днем народження» (або «Парадокс») і запитує, яка ймовірність того, що двоє з російських людей мають один день народження. Стаття у Вікіпедії [1] виглядає пристойно і містить кілька таблиць, які можуть вам бути корисними. Тим не менш, я спробую надати вам смак для відповіді і тут.
Деякі речі, які слід пам’ятати:
-Імовірність матчу та невідповідності повинна дорівнювати 1, значить P(match)=1−P(no match) і навпаки.
-До двох незалежних заходів A і B, ймовірність P(A&B)=P(A)⋅P(B).
Щоб отримати відповідь, ми почнемо з обчислення ймовірності не побачити відповідність для фіксованої кількості рядків k. Як тільки ми знаємо, як це зробити, ми можемо встановити це рівняння, що дорівнює порогу (1/100 000), і вирішити дляk. Для зручності давайте зателефонуємоN кількість можливих рядків (6220).
Ми збираємось "піти" вниз по списку і обчислити ймовірність того, що k^ {th} рядок відповідає будь-якому з рядків "вище" у списку. Перший рядок у нас єN загальних рядків і нічого в списку, так що Pk=1(no match)=NN=1. Для другого рядка є щеN загальних можливостей, але одна з них була "використана" першим рядком, тому ймовірність відповідності для цього рядка є Pk=2(no match)=N−1N Для третьої струни є два способи відповідності їй і тому N−2 способи не зробити так Pk=3(no match)=N−2Nі так далі. Загалом, ймовірність виникненняkth рядок, що не відповідає іншим, є
Пк( не відповідає ) =N- k + 1N
Однак ми хочемо, щоб не було відповідностей жодному з кструни. Оскільки всі події є незалежними (за запитанням), ми можемо просто помножити ці ймовірності разом так:
П( Без збігів ) =NN⋅N- 1N⋅N- 2N⋯N- k + 1N
Це можна трохи спростити:
П( Без збігів )П( Без збігів )П( Без збігів )=N⋅ ( N- 1 ) ⋅ ( N- 2 ) ⋯ ( N- k + 1 )Nк=N!Nк⋅ ( N- к ) !=к ! ⋅ (Nк)Nк
Перший крок просто множує дроби разом, другий використовує визначення факторіального (
к ! = ( k ) ⋅ ( k - 1 ) ⋅ ( k - 2 ) ⋯ 1) замінити продукцію
N−k+1⋯Nз чимось трохи більш керованим, а останній крок заміняється на двочленний коефіцієнт. Це дає нам рівняння щодо ймовірності відсутності збігів після генерації
kструни. Теоретично ви могли б встановити це рівним
1100,000 і вирішити для
k. На практиці відповісти на це буде складно, оскільки ви будете множувати / ділити на величезну кількість - фабрики ростуть дуже швидко (
100! довше 150 цифр).
Однак є наближення, як для обчислення факторіалу, так і для всієї проблеми. Цей документ [2] пропонує
k=0.5+0.25−2Nln(p)−−−−−−−−−−−−√
де р - ймовірність не побачити відповідність. Його випробування максимум на
N=48,000, але це все ще досить точно. Підключаючи ваші номери, я отримую приблизно
3.7⋅1015.
Список літератури
[1] http://en.wikipedia.org/wiki/Birthday_problem
[2] Матіс, Френк Х. (червень 1991). "Узагальнена проблема дня народження". Огляд SIAM (Товариство промислової та прикладної математики) 33 (2): 265–270. JSTOR Посилання