Kesin bir cevap var (aşağıdaki 4. maddede sunulan bir matris ürünü şeklinde). Bu gözlemlerden türetilen, hesaplamak için makul derecede etkili bir algoritma vardır:
Rastgele bir karışık kartları rastgele karıştırma ile üretilebilir kartlar ve daha sonra rasgele interspersing kalan içlerindeki kartı.N+kNk
Sadece asları karıştırarak ve sonra (ilk gözlemi uygulayarak) ikilileri, daha sonra üçleri ve benzerlerini serpiştirerek, bu sorun on üç adımlık bir zincir olarak görülebilir.
Aradığımız kartın değerinden daha fazlasını takip etmemiz gerekiyor. Ancak bunu yaparken , işaretin tüm kartlara göre konumunu değil, sadece eşit veya daha küçük değerli kartlara göre konumunu hesaba katmamız gerekmez .
İlk asın üzerine bir işaret koyduğunuzu ve daha sonra bulunan ilk ikisini işaretlediğinizi düşünün. (Herhangi bir aşamada deste, aradığımız kartı göstermeden biterse, tüm kartları işaretsiz bırakacağız.) Her işaretin "yeri" (varsa) eşit veya daha düşük değerli kartların sayısı olsun işaret yapıldığında (işaretli kartın kendisi dahil) dağıtıldı. Yerler tüm gerekli bilgileri içerir.
Sonra yer yapılır işareti rastgele bir sayıdır. Belirli bir güverte için, bu yerlerin sırası stokastik bir süreç oluşturur. Aslında bir Markov sürecidir (değişken geçiş matrisi ile). Bu nedenle, kesin bir cevap on iki matris çarpımından hesaplanabilir.ith
Bu fikirler kullanılarak, bu makine saniyede (çift kesinlikli kayar nokta ile hesaplama) değeri elde eder . Bu tam değerin gösterilen tüm rakamlar için doğrudur.5.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
Bu yazının geri kalanı ayrıntılar sağlar, çalışan bir uygulama sunar (in R
) ve sorunun ve çözümün etkinliği hakkında bazı yorumlarla sonuçlanır.
Bir güverte rastgele karıştırmalar oluşturma
Aslında kavramsal olarak daha ve en düşük değerde , bir sonraki en düşük olan kartlarının bir "destesini" (aka multiset olarak ) düşünmek artık daha karmaşık değildir . . (Sorulan soru, vektör tarafından belirlenen desteyle ilgilidir .)N=k1+k2+⋯+kmk1k213(4,4,…,4)
kartların "rastgele karıştırılması", eşit ve rastgele alınan bir permütasyon kartın permütasyonu . Bu karıştırmalar eşdeğer konfigürasyon gruplarına ayrılır çünkü "as" hiçbir şeyi değiştirmez, "ikişer" aralarına izin vermek de hiçbir şeyi değiştirmez, vb. Bu nedenle, kartların elbiseleri göz ardı edildiğinde özdeş görünen her bir permütasyon grubupermütasyon. Bu nedenle sayıları multinom katsayısı ile verilen bu gruplarNN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
güverte "kombinasyonları" olarak adlandırılır.
Kombinasyonları saymanın başka bir yolu var. İlk kartları yalnızca kombinasyon. Onlar terk sonraki ila çevrelerindeki hangi "yuva" kartları yerleştirilebilir. Bunu, " " kartlarından birini ve " " ile ek kart arasında kullanılabilecek bir yuva belirttiği bir :k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
Ne zaman ek kartlar serpiştirilmiş, yıldızlar ve yeni kart bölümleri deseni iki alt-grup halinde kart. Bu tür alt kümelerin sayısı .k2k1+k2(k1+k2k1,k2)=(k1+k2)!k1!k2!
Bu prosedürü "üçerli" ile tekrarlayarak , ilk kartları arasında . Bu nedenle, ilk kartlarını bu şekilde düzenlemenin toplam ayrı yolu sayısı eşittirk3((k1+k2)+k3k1+k2,k3)=(k1+k2+k3)!(k1+k2)!k3!k1+k2k1+k2+k3
1×(k1+k2)!k1!k2!×(k1+k2+k3)!(k1+k2)!k3!=(k1+k2+k3)!k1!k2!k3!.
Son kartları bitirdikten ve bu teleskop fraksiyonlarını çoğaltmaya devam ettikten sonra , elde edilen farklı kombinasyon sayısının daha önce sayılan toplam kombinasyon sayısına eşit olduğunu görüyoruz, . Bu yüzden hiçbir kombinasyonu göz ardı ettik. Bu , kartları karıştırmanın bu sıralı işleminin , her aşamada, yeni kartları eski arasında serpiştirmenin her olası farklı yolunun eşit eşit olasılıkla alındığı varsayılarak , her kombinasyonun olasılıklarını yakaladığı anlamına gelir .kn(Nk1,k2,…,km)
Yer süreci
Başlangıçta, as vardır ve açıkça ilk işaretlenir. Sonraki aşamalarında vardır kartları, yer (belirgin bir kart varsa) eşittir (bazı değer ile ) ve biz serpmek üzere olduğunuz kartları. Bunu aşağıdaki gibi bir diyagramla görselleştirebilirizk1n=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
burada " " şu anda işaretli sembolü belirtir. Koşullu yer bu değeri , bir sonraki yer eşit olasılığını bulmak istediğiniz (bazı değer ile ; oyunun kurallarına göre, bir sonraki yer sonra gelmelidir , nereden ). Boşluklarda yeni kartları kesişmek için kaç yol olduğunu bulabilirsek , bir sonraki yer eşit olur , bu kartların serpiştirilmesi için toplam yol sayısına bölebiliriz ( , gördüğümüz gibi)⊙pq1n+kpq≥p+1kq(n+kk)geçiş olasılığı yer değişir için . (Ayrıca, yeni kartlardan hiçbiri işaretli kartı takip etmediğinde yerin tamamen kaybolması için bir geçiş olasılığı olacaktır, ancak bunu açıkça hesaplamaya gerek yoktur.)pq
Diyagramı bu durumu yansıtacak şekilde güncelleyelim:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
"Dikey çubuk ilk yeni kart işaretli kart sonra oluşur gösterir:" yok yeni kart nedenle arasında görünebilir ve (ve bu nedenle herhangi bir yuva bu aralıkta gösterilmiştir). Biz bu yüzden sadece çağrıda, bu aralıkta kaç tane yıldız bilmiyorum bilinmeyen (sıfır olabilir) bunun arasındaki ilişkiyi bulduktan sonra kaybolur .|⊙|ssq
Varsayalım, o zaman, serpmek yıldızlı etrafında yeni kartlar önce ve sonra-- bağımsız Bunun --we kalan serpmek sonra yıldızların etrafındaki yeni kart . Varj⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
bunu yapmanın yolları. Yine de, bu - analizin en zor kısmıdır - yeri eşittir, çünkü|p+s+j+1
- Orada "eski" kartları veya işareti önce.p
- Orada işaretinden sonra ama daha önce eski kartlar .s|
- Orada yeni kart işareti önce.j
- kendisi tarafından temsil edilen yeni kart var .|
Böylece, bize yerden geçiş hakkında bilgi verir . Biz olası tüm değerleri için dikkatli bir şekilde, bu bilgileri izlemek zaman ve toplamı , tüm bu (ayrık) olanakları boyunca, yer koşullu olasılığı elde yer aşağıdaki ,τn,k(s,p)pq=p+s+j+1sqp
Prn,k(q|p)=(∑j(p−1+jj)(n+k−qk−j−1))/(n+kk)
burada toplam, ile başlar ve ile biter . (Bu toplamın değişken uzunluğu, özel durumlar dışında ve bir fonksiyonu olarak kapalı bir formül olması olası değildir .)j=max(0,q−(n+1))j=min(k−1,q−(p+1)n,k,q,p
Algoritma
Başlangıçta ihtimali vardır yer olacağını ve olasılık o başka muhtemel değere sahip olacaktır . Bu bir vektörü ile temsil edilebilir .1102,3,…,k1p1=(1,0,…,0)
Bir sonraki interspersing sonra kartları, vektör için güncelleştirilir geçiş matris tarafından (solda) çarpılarak . Bu, tüm kartları yerleştirilene kadar tekrarlanır . Her aşamada , olasılık vektörü girişlerin toplamı o şans bazı kart işaretlendi. Değeri eşit yapmak için ne kalırsa, adımından sonra hiçbir kartın işaretlenmemesi ihtimalik2p1p2(Prk1,k2(q|p),1≤p≤k1,1≤q≤k2)k1+k2+⋯+kmjpj1j. Bu değerlerde birbirini takip eden farklılıklar bize işaretlemek için tipi bir kart bulamadığımız olasılığını verir : bu, oyunun sonunda güverte bittiğinde aradığımız kartın değerinin olasılık dağılımıdır .j
uygulama
Aşağıdaki R
kod algoritmayı uygular. Önceki tartışmaya paraleldir. İlk olarak, geçiş olasılıklarının hesaplanması şu şekilde gerçekleştirilir t.matrix
( ile bölünme normalleştirilmeden , kodu test ederken hesaplamaları izlemeyi kolaylaştırır):(n+kk)
t.matrix <- function(q, p, n, k) {
j <- max(0, q-(n+1)):min(k-1, q-(p+1))
return (sum(choose(p-1+j,j) * choose(n+k-q, k-1-j))
}
Bu, yitransition
olarak güncellemek için kullanılır . Geçiş matrisini hesaplar ve çarpma işlemini gerçekleştirir. Argüman boş bir vektörse, başlangıç vektörünün hesaplanmasıyla da ilgilenir :pj−1pjp1p
#
# `p` is the place distribution: p[i] is the chance the place is `i`.
#
transition <- function(p, k) {
n <- length(p)
if (n==0) {
q <- c(1, rep(0, k-1))
} else {
#
# Construct the transition matrix.
#
t.mat <- matrix(0, nrow=n, ncol=(n+k))
#dimnames(t.mat) <- list(p=1:n, q=1:(n+k))
for (i in 1:n) {
t.mat[i, ] <- c(rep(0, i), sapply((i+1):(n+k),
function(q) t.matrix(q, i, n, k)))
}
#
# Normalize and apply the transition matrix.
#
q <- as.vector(p %*% t.mat / choose(n+k, k))
}
names(q) <- 1:(n+k)
return (q)
}
Artık herhangi bir güverte için her aşamada işaretsiz olasılıkları kolayca hesaplayabiliriz:
#
# `k` is an array giving the numbers of each card in order;
# e.g., k = rep(4, 13) for a standard deck.
#
# NB: the *complements* of the p-vectors are output.
#
game <- function(k) {
p <- numeric(0)
q <- sapply(k, function(i) 1 - sum(p <<- transition(p, i)))
names(q) <- names(k)
return (q)
}
İşte standart güverte için:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
Çıktı
A 2 3 4 5 6 7 8 9 T J Q K
0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Bir kral o zaman başka kartlar için bakmak olmaz kutlandı eğer kurallara göre, Bu değeri ifade eder yükselmiştir zorundadır . Bunu yaptıktan sonra, farklar "güverte bittiğinde olacağınız sayının" dağılımını verir:0.99944611
> g[13] <- 1; diff(g)
2 3 4 5 6 7 8 9 T J Q K
0.014285714 0.078037518 0.163626897 0.211916093 0.200325120 0.150026562 0.093388313 0.049854807 0.023333275 0.009731843 0.003663077 0.001810781
(Bunu, Monte-Carlo simülasyonunu açıklayan ayrı bir cevapta raporladığım çıktı ile karşılaştırın: beklenen miktarlarda rastgele varyasyona kadar aynı görünüyorlar.)
Beklenen değer hemen:
> sum(diff(g) * 2:13)
[1] 5.832589
Tüm bunlar, bunun sadece bir düzine satır çalıştırılabilir kod gerektirdiğini söyledi. Küçük değerleri ( kadar ) için el hesaplamalarına karşı kontrol ettim . Bu nedenle, kod ile sorunun önceki analizi arasında herhangi bir tutarsızlık ortaya çıkarsa, koda güvenin (analizin tipografik hataları olabileceğinden).k3
Uyarılar
Diğer dizilerle ilişkiler
Her bir karttan biri olduğunda, dağıtım tam sayıların karşılıklı dizisidir:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
Yerde değer olan( numaralı yerden başlayarak ). Bu, Tamsayı Dizilerinin Çevrimiçi Ansiklopedisinde A001048 dizisidir . Buna göre, sabit bir ("uygun" desteler) olan güvertelerin kendisi için bazı derin anlamları olan bu diziyi genelleştirecek kapalı bir formül . (Örneğin, permütasyon gruplarındaki en büyük eşleniklik sınıflarının boyutlarını sayar ve aynı zamanda trinomiyal katsayılarla da ilişkilidir .) (Ne yazık ki, için genellemedeki karşılıklılıklar genellikle tamsayı değildir.)ii!+(i−1)!i=1kik>1
Stokastik bir süreç olarak oyun
, vektörlerinin başlangıç katsayılarının sabit olduğunu açıkça ortaya koymaktadır . Örneğin, her bir kart grubunu işlerken çıktısını takip edelim :ipjj≥igame
> sapply(1:13, function(i) game(rep(4,i)))
[[1]]
[1] 0
[[2]]
[1] 0.00000000 0.01428571
[[3]]
[1] 0.00000000 0.01428571 0.09232323
[[4]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013
...
[[13]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Örneğin, son vektörün ikinci değeri ( 52 kartlık tam desteyle sonuçları açıklayan), ikinci grup işlendikten sonra ortaya çıkmıştır (ve eşittir ). Bu nedenle, yalnızca kart değeri üzerinden işaretler hakkında bilgi istiyorsanız , yalnızca kart destesi için hesaplama yapmanız gerekir .1/(84)=1/70jthk1+k2+⋯+kj
Değer bir kart işaretleme değil şansı Çünkü hızla yakın olmaktadır olarak arttıkça, sonra dört takımdaki kağıt türleri neredeyse beklenti için belli bir sınır değeri ulaştı. Gerçekten de, sınırlayıcı değer yaklaşık ( kartlık bir destede hesaplanır , bu noktada çift hassas yuvarlama hatası daha ileri gitmeyi önler).j1j135.8333554×32
Zamanlama
-vector için uygulanan algoritmaya bakıldığında, zamanlamasının ile orantılı olması gerektiğini ve - ham bir üst sınır kullanarak - orantılı olarak daha kötü olmadığını görüyoruz. . Tüm hesaplamaları ila ve ila için zamanlayarak ve yalnızca nispeten uzun süreleri ( saniye veya daha uzun) alan zamanları analiz ederek , hesaplama süresinin yaklaşık ) olduğunu tahmin ediyorum. , bu üst sınır değerlendirmesini desteklemektedir.( k , k , ... , k ) k 2 m 3 k = 1 7 , n = 10 , 30 1 / 2 , O ( k 2 , n 2.9 )m(k,k,…,k)k2m3k=17n=10301/2O(k2n2.9)
Bu asimptotiklerin bir kullanımı daha büyük problemler için hesaplama sürelerini yansıtmaktır. Örneğin, vakasının yaklaşık saniye sürdüğünü görmek, (çok ilginç) vakasının yaklaşık saniye. (Aslında saniye sürer .)1.31 k = 1 , n = 100 1.31 ( 1 / 4 ) 2 ( 100 / 30 ) 2.9 ≈ 2,7 2.87k=4,n=301.31k=1,n=1001.31(1/4)2(100/30)2.9≈2.72.87