Her bir taraf 3 kez görünene kadar bir kalıbın yuvarlanması için beklenen sayıda


15

Her bir taraf 3 kez ortaya çıkana kadar bir kalıbı kaç kez atmanız gerekir?

Bu soru Yeni Zelanda'daki ilkokulda sorulmuştur ve simülasyonlar kullanılarak çözülmüştür. Bu sorunun analitik çözümü nedir?


6
Ruloların sonuçları rastgele olduğu için önceden kaç ruloya ihtiyaç olduğunu bilmek mümkün değildir. Soru, örneğin, her bir tarafın 3 kez ortaya çıkmasından önce beklenen rulo sayısını araştırıyorsa, bu açıkça belirtilmelidir. Bu durumda, stats.stackexchange.com/tags/self-study/info uygulanır.
Juho Kokkala

3
Bu Yeni Zelandalı çocuklara Norman L. Johnson, Samuel Kotz, N. Balakrishnan "Kesikli Çok Değişkenli Dağılımlar" ı okumalarını söyleyin wiley.com/WileyCDA/WileyTitle/productCd-0471128449.html .
Mark L. Stone

Yanıtlar:


28

Tüm d=6 taraflarının eşit şansa sahip olduğunu varsayalım . Hadi genelleştirmek ve yan dek gerekli rulo beklenen sayısını bulmak 1 göründü n1 kez, yan 2 göründü n2 kat, ..., ve yan d göründü nd kere. Tarafların kimlikleri meselesi değil, çünkü bu amacın açıklaması yoğunlaşmış olabilir (hepsi eşit şansa sahip): Bize varsayalım i0 tarafın tüm görünmesini yok, i1 tarafın görünmesini gerek sadece bir kez, ... ve inkenarların n=max(n1,n2,,nd) kez görünmesi gerekir . Let

i=(i0,i1,,in)
bu durumu ve yazma tayin
e(i)
rulo beklenen sayıda. Soru istedi e(0,0,0,6): i3=6 , altı tarafın her birinin üç kez görülmesi gerektiğini belirtir.

Kolay bir tekrarlama mevcuttur. Bir sonraki rulo birine karşılık gelir görünen tarafında ij : is, ya evde görmek gerek yoktu, ya da biz, ..., bir kere görmek için gerekli ya da biz onu görmek için gerekli n daha zamanlar. j , onu kaç kere görmemiz gerektiğidir.

  • Ne zaman j=0 , biz gerek yoktu onu ve hiçbir şey değişiklikleri görmek için. Bu olasılığı ile olur .i0/d

  • olduğunda bu tarafı görmemiz gerekiyordu. Şimdi kere görülmesi gereken daha az bir taraf ve kere görülmesi gereken bir taraf daha var . Böylece, olur ve olur . Bileşenlerinin bu işlemi olsun tanımlanabilir , böylecej j - 1 i j i j - 1 i j - 1 i j + 1 i ijj>0jj1ijij1ij1ij+1iij

    ij=(i0,,ij2,ij1+1,ij1,ij+1,,in).

    Bu olasılığı ile olur .ij/d

Sadece bu kalıp rulosunu saymamız ve bize kaç rulo daha beklendiğini söylemek için özyineleme kullanmamız gerekiyor. Beklenti ve toplam olasılık yasalarına göre,

e(i)=1+i0de(i)+j=1nijde(ij)

( olduğunda , toplamdaki karşılık gelen terimin sıfır olduğunu .)ij=0

Eğer , bitti ve . Aksi takdirde için çözebiliriz , istenen özyinelemeli formülü verereke ( i ) = 0 e ( i )i0=de(i)=0e(i)

(1)e(i)=d+i1e(i1)++ine(in)di0.

Bildirim o , görmek istediğimiz toplam etkinlik sayısıdır. İşlem herhangi bir kişi tarafından bu miktar azaltır Resim her durumda,. Bu nedenle, bu özyineleme tam olarak( soruda eşit ). Dahası (kontrol edilmesi zor değil), bu sorudaki her özyineleme derinliğindeki olasılık sayısı azdır (asla geçmez ). Sonuç olarak, bu en azından kombinatoryal olasılıklar çok fazla olmadığında ve ara sonuçları hatırladığımızda etkili bir yöntemdir (böylece değerij j > 0 i j > 0 | i | 3 ( 6 ) = 18 8 e

|i|=0(i0)+1(i1)++n(in)
jj>0ij>0|i|3(6)=188e birden fazla hesaplanır).

O hesaplamak

e(0,0,0,6)=22868786045088836998400000000032.677.

Bu benim için çok küçük görünüyordu, bu yüzden bir simülasyon çalıştırdım R. Üç milyondan fazla zar attıktan sonra, bu oyun 100.000 kez tamamlandı ve ortalama uzunluğu . Bu tahminin standart hatası : bu ortalama ile teorik değer arasındaki fark önemsizdir ve teorik değerin doğruluğunu teyit eder.0.02732.6690.027

Uzunlukların dağılımı ilgi çekici olabilir. ( Her altı tarafı da üç kez toplamak için gereken minimum rulo sayısı başlamalıdır .)18

şekil

# Specify the problem
d <- 6   # Number of faces
k <- 3   # Number of times to see each
N <- 3.26772e6 # Number of rolls

# Simulate many rolls
set.seed(17)
x <- sample(1:d, N, replace=TRUE)

# Use these rolls to play the game repeatedly.
totals <- sapply(1:d, function(i) cumsum(x==i))
n <- 0
base <- rep(0, d)
i.last <- 0
n.list <- list()
for (i in 1:N) {
  if (min(totals[i, ] - base) >= k) {
    base <- totals[i, ]
    n <- n+1
    n.list[[n]] <- i - i.last
    i.last <- i
  }
}

# Summarize the results
sim <- unlist(n.list)
mean(sim)
sd(sim) / sqrt(length(sim))
length(sim)
hist(sim, main="Simulation results", xlab="Number of rolls", freq=FALSE, breaks=0:max(sim))

uygulama

Recursive hesaplama rağmen basittir, bazı bilgisayar ortamlarında bazı sorunları beraberinde getirmektedir. Bunların başında , hesaplanırken değerlerini saklamak var . Bu çok önemlidir, aksi takdirde her değer çok sayıda kez (fazladan) hesaplanacaktır. Ancak, tarafından dizine eklenmiş bir dizi için potansiyel olarak gereken depolama alanı çok büyük olabilir. İdeal olarak, yalnızca hesaplama sırasında karşılaşılan değerlerinin saklanması gerekir. Bu bir tür ilişkisel dizi gerektirir.ee(i)ii

Açıklamak gerekirse, işte çalışma Rkodu. Yorumlar, ara sonuçların saklanması için basit bir "AA" (ilişkilendirilebilir dizi) sınıfının oluşturulmasını açıklar. Vektörler dizelere dönüştürülür ve bunlar tüm değerleri tutacak bir listeye indekslemek için kullanılır . işlemi olarak uygulanmaktadır .iEij%.%

Bu başlangıçlar, özyinelemeli fonksiyonun ( , matematiksel gösterime paralel olacak şekilde tanımlanmasını sağlar. Özellikle, çizgie

x <- (d + sum(sapply(1:n, function(i) j[i+1]*e.(j %.% i))))/(d - j[1])

yukarıdaki formül ile doğrudan karşılaştırılabilir . Tüm endeksler artarak edilmiş unutmayın çünkü başlar onun diziler indeksleme yerine .(1)1R10

Zamanlama hesaplamanın saniye sürdüğünü gösterir ; değeri0.01e(c(0,0,0,6))

32,6771634160506

Biriken kayan nokta yuvarlama hatası son iki haneyi yok etti (daha 68ziyade olması gerekir 06).

e <- function(i) {
  #
  # Create a data structure to "memoize" the values.
  #
  `[[<-.AA` <- function(x, i, value) {
    class(x) <- NULL
    x[[paste(i, collapse=",")]] <- value
    class(x) <- "AA"
    x
  }
  `[[.AA` <- function(x, i) {
    class(x) <- NULL
    x[[paste(i, collapse=",")]]
  }
  E <- list()
  class(E) <- "AA"
  #
  # Define the "." operation.
  #
  `%.%` <- function(i, j) {
    i[j+1] <- i[j+1]-1
    i[j] <- i[j] + 1
    return(i)
  }
  #
  # Define a recursive version of this function.
  #
  e. <- function(j) {
    #
    # Detect initial conditions and return initial values.
    #
    if (min(j) < 0 || sum(j[-1])==0) return(0)
    #
    # Look up the value (if it has already been computed).
    #
    x <- E[[j]]
    if (!is.null(x)) return(x)
    #
    # Compute the value (for the first and only time).
    #
    d <- sum(j)
    n <- length(j) - 1
    x <- (d + sum(sapply(1:n, function(i) j[i+1]*e.(j %.% i))))/(d - j[1])
    #
    # Store the value for later re-use.
    #
    E[[j]] <<- x
    return(x)
  }
  #
  # Do the calculation.
  #
  e.(i)
}
e(c(0,0,0,6))

Son olarak, tam cevabı veren orijinal Mathematica uygulaması. Memoization yapılır aracılığıyla deyimsel e[i_] := e[i] = ...neredeyse tüm ortadan kaldırarak, ifade Rönbilgileri. Bununla birlikte, dahili olarak, iki program aynı şeyleri aynı şekilde yapıyor.

shift[j_, x_List] /; Length[x] >= j >= 2 := Module[{i = x},
   i[[j - 1]] = i[[j - 1]] + 1;
   i[[j]] = i[[j]] - 1;
   i];
e[i_] := e[i] = With[{i0 = First@i, d = Plus @@ i},
    (d + Sum[If[i[[k]] > 0, i[[k]]  e[shift[k, i]], 0], {k, 2, Length[i]}])/(d - i0)];
e[{x_, y__}] /; Plus[y] == 0  := e[{x, y}] = 0

e[{0, 0, 0, 6}]

228687860450888369984000000000


5
+1 Bu soruyu sorduran öğrenciler için notasyonun bazılarının takip edilmesinin zor olacağını düşünüyorum (şu anda önermek için somut bir alternatifim yok). Öte yandan böyle bir soru ile ne yapmak istediklerini merak ediyorum.
Glen_b

1
@Glen_b Zarları yuvarlayarak (ve sonuçları konuşarak) çok şey öğrenebilirlerdi. Öğretmen dinlenirken bir sınıfı yarım saat meşgul etmek için iyi bir yol gibi geliyor :-).
whuber

12

Bu sorunun orijinal versiyonu hayata şu şekilde sorarak başladı:

Her bir taraf 3 kez görünene kadar kaç rulo gerekir

Gerekli rulo sayısının dağılımı ... her bir taraf 3 kez görünecek şekilde

nXiii{1,,6}(X1,X2,,X6)Multinomial(n,16)

P(X1=x1,,X6=x6)=n!x1!x6!16n subject to: i=16xi=n

İzin Vermek: N=min{n:Xi3i}.NP(Nn)=P(Xi3|n)

P(Nn)n={18,19,20,}

P(X13,,X63) where (X1,,X6)Multinomial(n,16)

n

 cdf = ParallelTable[ 
   Probability[x1 >= 3 && x2 >= 3 && x3 >= 3 && x4 >= 3 && x5 >= 3 &&  x6 >= 3, 
       {x1, x2, x3, x4, x5, x6} \[Distributed] MultinomialDistribution[n, Table[1/6, 6]]],
    {n, 18, 60}]

n

1814889875110199605761928290762544079842304203111983875176319369216211168408491253173748645888223283142988125507799783342082361483465418375609359740010496

P(Nn)n

resim açıklamasını buraya girin

P(N=n)

resim açıklamasını buraya girin

Tabii ki, dağılımın üst sınırı yoktur, ancak burada pratikte gerekli olduğu kadar çok değeri kolayca çözebiliriz. Yaklaşım geneldir ve istenen tarafların istenen kombinasyonu için de işe yaramalıdır.

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.