100 kez 20 yüzden fazla görünen yüz yok rulo


11

Başımı bu sorunun etrafına sarmaya çalışıyorum.
Bir kalıp 100 kez yuvarlanır. Hiçbir yüzün 20 kereden fazla görünmeme olasılığı nedir? İlk düşüncem Binom dağılımı P (x) = 1-6 cmf (100, 1/6, 20) kullanmaktı, ancak bazı vakaları birden fazla saydığımız için bu kesinlikle yanlış. İkinci fikrim x1 + x2 + x3 + x4 + x5 + x6 = 100 gibi tüm olası ruloları numaralandırmak, böylece xi <= 20 olacak ve multinomiyalleri toplayacak ama bu çok hesaplama açısından yoğun görünüyor. Yaklaşık çözümler benim için de işe yarayacak.

Yanıtlar:


13

Bu ünlü Doğum Günü Sorununun bir genellemesidir : d = 6 olasılık kümesi arasında rastgele, eşit olarak dağıtılmış "doğum günleri" olan n=100 kişi göz önüne alındığında , hiçbir doğum gününün m = 20'den fazla kişi tarafından paylaşılma şansı nedir?d=6m=20

Kesin bir hesaplama 0.267 cevabını verir (iki kat hassasiyetle). Teoriyi çizeceğim ve genel n , m , d için kod vereceğim . Kodun asimptotik zamanlaması O ( n 2 log ( d ) ) ' dir ve bu da onu çok sayıda doğum günü d için uygun hale getirirve n binlerceyekadar makul performans sağlar. Bu noktada, Poisson yaklaşımı, doğum günü paradoksunu 2'den fazla kişiye genişletme konusundatartışıldı,çoğu durumda iyi çalışmalıdır.0.267747907805267n,m,d.Ö(n2günlük(d))dn


Çözüm açıklaması

D- taraflı bir kalıbın bağımsız merdanesinin sonuçları için olasılık oluşturma fonksiyonu (pgf)nd

d-nfn(x1,x2,...,xd)=d-n(x1+x2++xd)n.

Katsayısı Bu multinomial genişlemesi karşılaştıkları hangi yollarla sayısını verir i tam görünebilir e i , kat i = 1 , 2 , ... , d .x1e1x2e2xdedieii=1,2,,d.

En fazla bizim ilgi sınırlandırılması herhangi yüze göre görünüşe değerlendirilmesi için eşit olduğunu f n idealdir modulo I tarafından üretilen x m + 1 1 , x m + 1 2 , ... , x m + 1 d . Bu değerlendirmeyi yapmak için Binom Teoremini tekrar tekrar kullanın.mfnIx1m+1,x2m+1,,xdm+1.

fn(x1,...,xd)=((x1++xr)+(xr+1+xr+2++x2r))n=Σk=0n(nk)(x1++xr)k(xr+1++x2r)n-k=Σk=0n(nk)fk(x1,...,xr)fn-k(xr+1,...,x2r)

zaman ve eşitlenir. Yazma f ( d ) n = f n ( 1 , 1 , ... , 1 ) ( d terimleri), elimizdekid=2rfn(d)=fn(1,1,...,1)d

(A)fn(2r)=Σk=0n(nk)fk(r)fn-k(r).

Tüm garip, benzer bir ayrışma kullanımıd=2r+1

fn(x1,...,xd)=((x1++x2r)+x2r+1)n=Σk=0n(nk)fk(x1,...,x2r)fn-k(x2r+1),

vererek

(B)fn(2r+1)=Σk=0n(nk)fk(2r)fn-k(1).

Her iki durumda da, modulo olan her şeyi azaltabiliriz.ben

fn(xj){xnnm0n>mşıkben,

özyineleme için başlangıç ​​değerlerinin sağlanması,

fn(1)={1nm0n>m

Bunu etkili kılan, değişkenlerini her biri eşit büyüklükte iki r değişken grubuna bölerek ve tüm değişken değerlerini 1 olarak ayarlayarak , her şeyi bir grup için sadece bir kez değerlendirip sonuçları birleştirmemizdir. Bu , her biri kombinasyon için O ( n ) hesaplamasına ihtiyaç duyan n + 1 terimine kadar hesaplama gerektirir . Hatta saklamak için bir 2D dizi gerekmez f ( r ) N , hesaplanırken için f ( d ) N , sadece fdr1,n+1Ö(n)fn(r)fn(d), vef ( 1 ) n gereklidir.fn(r)fn(1)

Toplam adım sayısı, nin ikili genişlemesindeki basamak sayısından (bu, formül ( a ) ' daki bölünmeleri eşit gruplara sayar ) artı genişlemedeki sayıların sayısından (her seferinde tek sayılan) ( b ) ) formülünün uygulanmasını gerektiren değerle karşılaşılır . Bu hala sadece O ( log ( d ) ) adımları.d(bir)(b)Ö(günlük(d))

In Rbir on yıllık iş istasyonu üzerinde çalışmak 0.007 saniyede yapıldı. Kod, bu yazının sonunda listelenir. Olası taşmaları veya çok fazla taşmayı biriktirmemek için olasılıkların yerine olasılıkların logaritmasını kullanır. Bu , çözümdeki faktörünün çıkarılmasını mümkün kılar , böylece olasılıkların altında yatan sayıları hesaplayabiliriz.d-n

Bu prosedürün , olasılıklarının tümünün aynı anda hesaplanmasıyla sonuçlandığını ve bu da şansın n ile nasıl değiştiğini kolayca incelememizi sağlar .f0,f1,...,fnn


Uygulamalar

Genelleştirilmiş Doğum Günü Sorunundaki dağılım, fonksiyon tarafından hesaplanır tmultinom.full. Tek zorluk, bir çarpışma şansının çok büyük hale gelmesinden önce mevcut olması gereken insan sayısı için bir üst sınır bulmaktır. Aşağıdaki kod bunu küçük n ile başlayan ve yeterince büyük olana kadar iki katına çıkaran kaba kuvvetle yapar . Bütün hesaplanması, bu yüzden alır O ( n, 2 günlük ( n ) giriş ( d ) ) bir zaman burada n bir çözümdür. Aracılığıyla halkın sayılar için olasılıkların tüm dağıtım yukarı n hesaplanır.m+1nÖ(n2günlük(n)günlük(d))nn

#
# 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)
}

Örnek olarak, bir kalabalığın hesaplamada bulunan en az sekizinin doğum gününü paylaşma olasılığından daha fazla olması için gereken minimum kişi sayısı . Sadece birkaç saniye sürüyor. İşte çıktının bir parçası:798birthday(7)

şekil


Bu sorunun özel bir sürümü , doğum günü paradoksunu 2'den fazla kişiye genişletme konusunda ele alınmıştır, bu da çok sayıda haddelenmiş taraflı bir kalıp vakasıyla ilgilidir .365


kod

# 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)
}

Cevap şu şekilde elde edilir:

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

,267747907805267


4

Rastgele örnekleme yöntemi

Bir milyon kez 100 die atar çoğaltma R bu kodu koştu:

y <- çoğalt (1000000, tümü (tablo (örnek (1: 6, boyut = 100, değiştir = DOĞRU)) <= 20))

Tüm yüzler 20 kattan daha az veya eşitse, çoğaltma işlevi içindeki kodun çıkışı doğrudur. y, 1 milyon doğru veya yanlış değeri olan bir vektördür.

Toplam hayır. y cinsinden gerçek değerlerin 1 milyona bölünmesi, arzu ettiğiniz olasılığa yaklaşık olarak eşit olmalıdır. Benim durumumda 266872/1000000 idi, bu da% 26,6 civarında bir olasılık olduğunu gösteriyor


3
OP'ye

1
Bir düzenleme notu yerleştirmek bazen tüm yazıyı düzenlemekten daha az açık olduğu için yazıyı düzenledim (ikinci kez). Yazıdaki tarihin izini tutmanın yararlı olduğunu düşünüyorsanız, geri dönmekten çekinmeyin. meta.stackexchange.com/questions/127639/…
Sextus Empiricus

4

Kaba kuvvet hesaplaması

Bu kod dizüstü bilgisayarımda birkaç saniye sürüyor

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

çıktı: 0.2677479

Ancak yine de, bu hesaplamaların çoğunu yapmak veya daha yüksek değerler kullanmak veya daha zarif bir yöntem elde etmek için daha doğrudan bir yöntem bulmak ilginç olabilir.

En azından bu hesaplama, diğer (daha karmaşık) yöntemleri kontrol etmek için basit olarak hesaplanmış ancak geçerli bir sayı verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.