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?
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?
Yanıtlar:
Tüm taraflarının eşit şansa sahip olduğunu varsayalım . Hadi genelleştirmek ve yan dek gerekli rulo beklenen sayısını bulmak göründü kez, yan göründü kat, ..., ve yan görü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 tarafın tüm görünmesini yok, tarafın görünmesini gerek sadece bir kez, ... ve kenarların kez görünmesi gerekir . Let
Kolay bir tekrarlama mevcuttur. Bir sonraki rulo birine karşılık gelir görünen tarafında : 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 daha zamanlar. , onu kaç kere görmemiz gerektiğidir.
Ne zaman , biz gerek yoktu onu ve hiçbir şey değişiklikleri görmek için. Bu olasılığı ile olur .
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 i ⋅ j
Bu olasılığı ile olur .
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,
( olduğunda , toplamdaki karşılık gelen terimin sıfır olduğunu .)
Eğer , bitti ve . Aksi takdirde için çözebiliriz , istenen özyinelemeli formülü verereke ( i ) = 0 e ( i )
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ğeri⋅ j j > 0 i j > 0 | i | 3 ( 6 ) = 18 8 e
O hesaplamak
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.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 .)
# 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))
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.
Açıklamak gerekirse, işte çalışma R
kodu. 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 .E
%.%
Bu başlangıçlar, özyinelemeli fonksiyonun ( , matematiksel gösterime paralel olacak şekilde tanımlanmasını sağlar. Özellikle, çizgi
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 .R
Zamanlama hesaplamanın saniye sürdüğünü gösterir ; değerie(c(0,0,0,6))
32,6771634160506
Biriken kayan nokta yuvarlama hatası son iki haneyi yok etti (daha 68
ziyade 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}]
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
İzin Vermek:
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}]
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.