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.O(n2log(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 .xe11xe22⋯xeddieii=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.mfnIxm+11,xm+12,…,xm+1d.
fn( x1, … , Xd)= ( ( x1+ ⋯ + xr) + ( xr + 1+ xr + 2+ ⋯ + x2 r) )n= ∑k = 0n( nk) (x1+ ⋯ + xr)k( xr + 1+ ⋯ + x2 r)n - k= ∑k = 0n( nk) fk( x1, … , Xr) fn - k( xr + 1, … , X2 r)
zaman ve eşitlenir. Yazma f ( d ) n = f n ( 1 , 1 , ... , 1 ) ( d terimleri), elimizdekid= 2 rf( d)n= fn( 1 , 1 , … , 1 )d
f( 2 r )n= ∑k = 0n( nk) f( r )kf( r )n - k.(A)
Tüm garip, benzer bir ayrışma kullanımıd= 2 r + 1
fn( x1, … , Xd)= ( ( x1+ ⋯ + x2 r) + x2 r + 1)n= ∑k = 0n( nk) fk( x1, … , X2 r) fn - k( x2 r + 1) ,
vererek
f( 2 r + 1 )n= ∑k = 0n( nk) f( 2 r )kf( 1 )n - k.(B)
Her iki durumda da, modulo olan her şeyi azaltabiliriz.ben
fn( xj) ≅{ xn0n ≤ mn > mşıkben,
özyineleme için başlangıç değerlerinin sağlanması,
f( 1 )n= { 10n ≤ mn > 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 + 1O ( n )f( r )nf( d)n, vef ( 1 ) n gereklidir.f( r )nf( 1 )n
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( a )( b )O ( 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 + 1nO ( 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)

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