จำนวนครั้งที่คาดว่าคุณจะต้องกลิ้งตายจนกว่าแต่ละด้านจะปรากฏ 3 ครั้งคืออะไร?
คำถามนี้ถูกถามในโรงเรียนประถมในนิวซีแลนด์และแก้ไขด้วยการจำลองสถานการณ์ โซลูชันการวิเคราะห์สำหรับปัญหานี้คืออะไร
จำนวนครั้งที่คาดว่าคุณจะต้องกลิ้งตายจนกว่าแต่ละด้านจะปรากฏ 3 ครั้งคืออะไร?
คำถามนี้ถูกถามในโรงเรียนประถมในนิวซีแลนด์และแก้ไขด้วยการจำลองสถานการณ์ โซลูชันการวิเคราะห์สำหรับปัญหานี้คืออะไร
คำตอบ:
สมมติว่าด้านมีโอกาสเท่ากัน ลองพูดคุยกันและหาจำนวนม้วนที่คาดหวังที่ต้องการจนกว่าด้าน1จะปรากฏn 1ครั้ง, ด้านที่2ได้ปรากฏn 2ครั้ง, ... , และด้านdได้ปรากฏn dครั้ง เนื่องจากตัวตนของด้านไม่สำคัญ (พวกเขาทั้งหมดมีโอกาสเท่ากัน), คำอธิบายของวัตถุประสงค์นี้สามารถย่อ: ให้เราสมมติว่าi 0ข้างไม่ต้องปรากฏเลย, ฉัน1ด้านต้องปรากฏ เพียงครั้งเดียว ... และฉันnด้านข้างต้องปรากฏครั้ง ให้i = ( i 0 , i 1 , … , i n )กำหนดสถานการณ์นี้และเขียนe ( i )สำหรับจำนวนม้วนที่คาดหวัง คำถามถามหาe ( 0 , 0 , 0 , 6 ) :
มีการเกิดซ้ำได้ง่าย ที่ม้วนถัดไปด้านข้างที่ปรากฏสอดคล้องกับหนึ่งใน : นั่นคือทั้งที่เราไม่จำเป็นต้องเห็นมันหรือเราต้องการที่จะเห็นมันครั้งเดียว ... หรือเราต้องการที่จะเห็นมันครั้งมากขึ้น . คือจำนวนครั้งที่เราต้องการเห็นมัน
เมื่อเราไม่จำเป็นต้องเห็นและไม่มีอะไรเปลี่ยนแปลง เรื่องนี้เกิดขึ้นกับความน่าจะวัน
เมื่องั้นเราก็ต้องเห็นด้านนี้ ขณะนี้มีด้านที่น้อยกว่าที่ต้องเห็นj คูณและอีกด้านหนึ่งที่ต้องเห็นj - 1ครั้ง ดังนั้นฉันเจกลายเป็นฉันJ - 1และฉันJ - 1กลายเป็นฉันเจ + 1 ให้การนี้กับชิ้นส่วนของผมจะกำหนดให้ฉัน ⋅ ญเพื่อให้
เรื่องนี้เกิดขึ้นกับความน่าจะเป็น d
เราเพียงแค่ต้องนับม้วนกระดาษม้วนนี้และใช้การเรียกซ้ำเพื่อบอกให้เราทราบว่ามีม้วนกระดาษเพิ่มอีกกี่ตัว ตามกฎแห่งความคาดหวังและความน่าจะเป็นโดยรวม
(ให้เข้าใจว่าเมื่อใดก็ตามที่คำที่เกี่ยวข้องในผลรวมคือศูนย์)
ถ้าเราจะทำและอี( ฉัน ) = 0 มิฉะนั้นเราอาจแก้หาe ( i )โดยให้สูตรเรียกซ้ำที่ต้องการ
ขอให้สังเกตว่าคือจำนวนกิจกรรมทั้งหมดที่เราต้องการดู การดำเนินการ⋅ jช่วยลดปริมาณนั้นหนึ่งสำหรับj > 0ใด ๆ ที่ฉันให้j > 0ซึ่งเป็นกรณีเสมอ ดังนั้นการเรียกซ้ำนี้จึงสิ้นสุดลงที่ระดับความลึกที่แม่นยำ| ฉัน| (เท่ากับ3 ( 6 ) =
ฉันคำนวณว่า
นั่นดูเล็กมากสำหรับฉันดังนั้นฉันจึงทำการจำลอง (โดยใช้R
) หลังจากกว่าสามล้านม้วนของลูกเต๋าเกมนี้ได้รับการเล่นที่จะเสร็จสิ้นในช่วง 100,000 ครั้งโดยมีความยาวเฉลี่ยของ32.669ข้อผิดพลาดมาตรฐานของการประมาณนั้นคือ0.027 : ความแตกต่างระหว่างค่าเฉลี่ยนี้กับค่าทางทฤษฎีไม่มีนัยสำคัญยืนยันความถูกต้องของค่าทางทฤษฎี
การกระจายความยาวอาจเป็นที่สนใจ (เห็นได้ชัดว่ามันจะต้องเริ่มต้นที่จำนวนขั้นต่ำของม้วนที่จำเป็นในการรวบรวมทั้งหกด้านสามครั้งละ)
# 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))
R
E
%.%
x <- (d + sum(sapply(1:n, function(i) j[i+1]*e.(j %.% i))))/(d - j[1])
R
e(c(0,0,0,6))
32.6771634160506
ข้อผิดพลาดในการปัดเศษทศนิยมทำให้เกิดการทำลายตัวเลขสองหลักสุดท้าย (ซึ่งควร68
มากกว่า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))
ในที่สุดนี่คือการใช้Mathematicaดั้งเดิมที่สร้างคำตอบที่แน่นอน การบันทึกช่วยจำทำได้โดยการใช้สำนวนe[i_] := e[i] = ...
ซึ่งกำจัดR
ขั้นต้นเกือบทั้งหมด ภายในแม้ว่าทั้งสองโปรแกรมกำลังทำสิ่งเดียวกันในลักษณะเดียวกัน
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}]
คำถามเดิมของคำถามนี้เริ่มต้นชีวิตโดยการถาม:
จำเป็นต้องมีกี่ม้วนจนกว่าแต่ละด้านจะปรากฏขึ้น 3 ครั้ง
การกระจายของจำนวนม้วนที่ต้องการ ... เพื่อให้แต่ละด้านปรากฏ 3 ครั้ง
ปล่อย:
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}]
แน่นอนว่าการกระจายไม่มีขอบเขตบน แต่เราสามารถแก้ไขได้อย่างง่ายดายที่นี่สำหรับค่ามากที่สุดเท่าที่จำเป็นในทางปฏิบัติ วิธีการนี้เป็นเรื่องทั่วไปและควรใช้งานได้ดีเช่นกันสำหรับทุกด้านที่ต้องการ