Помер 100 рулонів без обличчя, з'явившись більше 20 разів


11

Я намагаюся обернути голову навколо цієї проблеми.
Штамп котиться 100 разів. Яка ймовірність того, що жодне обличчя не з’явиться більше 20 разів? Першою моєю думкою було використання розподілу біномів P (x) = 1 - 6 cmf (100, 1/6, 20), але це, очевидно, неправильно, оскільки ми рахуємо деякі випадки не один раз. Моя друга ідея - перерахувати всі можливі рулони x1 + x2 + x3 + x4 + x5 + x6 = 100, так що xi <= 20 та підсумовувати багаточлени, але це здається занадто обчислювально інтенсивним. Приблизні рішення також будуть працювати для мене.

Відповіді:


13

Це узагальнення відомої проблеми з днем ​​народження : з урахуванням осіб, які мають випадкові, рівномірно розподілені "дні народження" серед безлічі можливостей, який шанс, що жоден день народження не поділяється більше осіб?d = 6 м = 20н=100г=6м=20

Точний розрахунок дає відповідь (з подвоєною точністю). Я буду замалювати теорію і навести код для загальних Асимптотичний час коду - що робить його придатним для дуже великої кількості днів народження і забезпечує розумну продуктивність, поки стане тисячами. Тоді наближення Пуассона, обговорене під час розширення парадокса дня народження до більш ніж 2 людей, повинно працювати в більшості випадків.п , м , д . O ( n 2 log ( d ) ) d n0,267747907805267н,м,г.О(н2журнал(г))гн


Пояснення рішення

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

г-нfн(х1,х2,,хг)=г-н(х1+х2++хг)н.

Коефіцієнт при розширенні цього мультиномії дає кількість способів, за якими обличчя може відображатися саме разів, i e i i = 1 , 2 , , d .х1е1х2е2хгегiеii=1,2,,г.

Обмеження нашої зацікавленості не більш ніж появою будь-яким обличчям рівнозначно оцінюванню modulo ідеального породжував Для проведення цієї оцінки використовуйте теорему бінома рекурсивно для отриманняf n I x m + 1 1 , x m + 1 2 , , x m + 1 d .мfнЯх1м+1,х2м+1,,хгм+1.

fн(х1,,хг)=((х1++хr)+(хr+1+хr+2++х2r))н=к=0н(нк)(х1++хr)к(хr+1++х2r)н-к=к=0н(нк)fк(х1,,хr)fн-к(хr+1,,х2r)

коли парне. Записуючи ( терміни), маємоf ( d ) n = f n ( 1 , 1 , , 1 ) dг=2rfн(г)=fн(1,1,,1)г

(а)fн(2r)=к=0н(нк)fк(r)fн-к(r).

Коли непарне, використовуйте аналогічне розкладанняd=2r+1

fн(х1,,хг)=((х1++х2r)+х2r+1)н=к=0н(нк)fк(х1,,х2r)fн-к(х2r+1),

давання

(b)fн(2r+1)=к=0н(нк)fк(2r)fн-к(1).

В обох випадках ми можемо також зменшити все модуль , що легко виконується починаючи зЯ

fн(хj){хннм0н>ммодЯ,

забезпечення вихідних значень для рекурсії,

fн(1)={1нм0н>м

Це робить це ефективним тим, що розбиваючи змінні на дві однакові за розміром групи змінних і встановлюючи всі значення змінних до нам потрібно лише оцінити все один раз для однієї групи, а потім об'єднати результати. Для цього потрібні обчислення до доданків, кожен з яких потребує обчислення для комбінації. Нам навіть не потрібен 2D-масив для зберігання , тому що при обчисленні потрібні лише і .r 1 , n + 1 O ( n ) f ( r ) n f ( d ) n , f ( r ) n f ( 1 ) nгr1,н+1О(н)fн(r)fн(г),fн(r)fн(1)

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

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

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


Програми

Розподіл в узагальненій задачі про день народження обчислюється функцією tmultinom.full. Єдине завдання полягає у пошуку верхньої межі кількості людей, які повинні бути присутніми, перш ніж шанс зіткнення стане надто великим. Наступний код робить це грубою силою, починаючи з малого і подвоюючи його, поки він не буде достатньо великим. Тому весь розрахунок займає час де - рішення. Обчислюється весь розподіл ймовірностей на кількість людей, що перевищують .м+1нО(н2журнал(н)журнал(г))нн

#
# The birthday problem: find the number of people where the chance of
# a collision of `m+1` birthdays first exceeds `alpha`.
#
birthday <- function(m=1, d=365, alpha=0.50) {
  n <- 8
  while((p <- tmultinom.full(n, m, d))[n] > alpha) n <- n * 2
  return(p)
}

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

Малюнок


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


Код

# Compute the chance that in `n` independent rolls of a `d`-sided die, 
# no side appears more than `m` times.
#
tmultinom <- function(n, m, d, count=FALSE) tmultinom.full(n, m, d, count)[n+1]
#
# Compute the chances that in 0, 1, 2, ..., `n` independent rolls of a
# `d`-sided die, no side appears more than `m` times.
#
tmultinom.full <- function(n, m, d, count=FALSE) {
  if (n < 0) return(numeric(0))
  one <- rep(1.0, n+1); names(one) <- 0:n
  if (d <= 0 || m >= n) return(one)

  if(count) log.p <- 0 else log.p <- -log(d)
  f <- function(n, m, d) {                   # The recursive solution
    if (d==1) return(one)                    # Base case
    r <- floor(d/2)
    x <- double(f(n, m, r), m)               # Combine two equal values
    if (2*r < d) x <- combine(x, one, m)     # Treat odd `d`
    return(x)
  }
  one <- c(log.p*(0:m), rep(-Inf, n-m))      # Reduction modulo x^(m+1)
  double <- function(x, m) combine(x, x, m)
  combine <- function(x, y, m) {             # The Binomial Theorem
    z <- sapply(1:length(x), function(n) {   # Need all powers 0..n
      z <- x[1:n] + lchoose(n-1, 1:n-1) + y[n:1]
      z.max <- max(z)
      log(sum(exp(z - z.max), na.rm=TRUE)) + z.max
    })
    return(z)
  }
  x <- exp(f(n, m, d)); names(x) <- 0:n
  return(x)
}

Відповідь отримуємо за допомогою

print(tmultinom(100,20,6), digits=15)

0,267747907805267


4

Випадковий метод вибірки

Я запустив цей код у R, повторюючи 100 закидів у мільйон разів:

y <- копія (1000000, всі (таблиця (зразок (1: 6, розмір = 100, заміна = ІСТИНА)) <= 20))

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

Загальна ні. істинних значень у y, розділених на 1 мільйон, має бути приблизно рівним бажаній вам ймовірності. У моєму випадку це було 266872/1000000, що передбачає ймовірність приблизно 26,6%


3
Виходячи з ОП, я думаю, що це повинно бути <= 20, а не <20
клумба

1
Я редагував публікацію (вдруге), оскільки розміщення примітки про редагування іноді менш зрозуміло, ніж редагування всієї публікації. Не соромтеся повернути його, якщо ви вважаєте, що корисно зберегти слід історії. meta.stackexchange.com/questions/127639/…
Секст

4

Розрахунок грубої сили

Цей код займає кілька секунд на моєму ноутбуці

total = 0
pb <- txtProgressBar(min = 0, max = 20^2, style = 3)
for (i in 0:20) {
  for (j in 0:20) {
    for (k in 0:20) { 
      for (l in 0:20) {
        for (m in 0:20) {
          n = 100-sum(i,j,k,l,m)
          if (n<=20) {
            total = total+dmultinom(c(i,j,k,l,m,n),100,prob=rep(1/6,6))
          }
        }
      }
    }
    setTxtProgressBar(pb, i*20+j) # update progression bar            
  }
}
total

вихід: 0,2677479

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

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

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