จำนวนครั้งที่คาดว่าจะหมุนตายจนกว่าแต่ละด้านจะปรากฏขึ้น 3 ครั้ง


15

จำนวนครั้งที่คาดว่าคุณจะต้องกลิ้งตายจนกว่าแต่ละด้านจะปรากฏ 3 ครั้งคืออะไร?

คำถามนี้ถูกถามในโรงเรียนประถมในนิวซีแลนด์และแก้ไขด้วยการจำลองสถานการณ์ โซลูชันการวิเคราะห์สำหรับปัญหานี้คืออะไร


6
เนื่องจากผลลัพธ์ของม้วนเป็นแบบสุ่มจึงไม่สามารถทราบล่วงหน้าได้ว่าต้องการม้วนกี่ม้วน ตัวอย่างเช่นหากต้องการค้นหาจำนวนม้วนที่คาดไว้ก่อนที่แต่ละด้านจะปรากฏขึ้น 3 ครั้งควรระบุอย่างชัดเจน ในกรณีดังกล่าวจะใช้stats.stackexchange.com/tags/self-study/info
Juho Kokkala

3
บอกผู้นิวซีแลนด์เด็กที่จะอ่านนอร์แมนแอลจอห์นสัน, ซามูเอลคอตซ์เอ็นบาลาค "ไม่ต่อเนื่องหลายตัวแปรกระจาย" wiley.com/WileyCDA/WileyTitle/productCd-0471128449.html
Mark L. Stone

คำตอบ:


28

สมมติว่าด้านมีโอกาสเท่ากัน ลองพูดคุยกันและหาจำนวนม้วนที่คาดหวังที่ต้องการจนกว่าด้าน1จะปรากฏn 1ครั้ง, ด้านที่2ได้ปรากฏn 2ครั้ง, ... , และด้านdได้ปรากฏn dครั้ง เนื่องจากตัวตนของด้านไม่สำคัญ (พวกเขาทั้งหมดมีโอกาสเท่ากัน), คำอธิบายของวัตถุประสงค์นี้สามารถย่อ: ให้เราสมมติว่าi 0ข้างไม่ต้องปรากฏเลย, ฉัน1ด้านต้องปรากฏ เพียงครั้งเดียว ... และฉันnd=61n12n2dndi0i1inด้านข้างต้องปรากฏครั้ง ให้i = ( i 0 , i 1 , , i n )กำหนดสถานการณ์นี้และเขียนe ( i )สำหรับจำนวนม้วนที่คาดหวัง คำถามถามหาe ( 0 , 0 , 0 , 6 ) :n=max(n1,n2,,nd)

i=(i0,i1,,in)
e(i)
e(0,0,0,6)i3=6 บ่งบอกว่าทั้งหกด้านจะต้องเห็นสามครั้งในแต่ละครั้ง

มีการเกิดซ้ำได้ง่าย ที่ม้วนถัดไปด้านข้างที่ปรากฏสอดคล้องกับหนึ่งใน : นั่นคือทั้งที่เราไม่จำเป็นต้องเห็นมันหรือเราต้องการที่จะเห็นมันครั้งเดียว ... หรือเราต้องการที่จะเห็นมันครั้งมากขึ้น . คือจำนวนครั้งที่เราต้องการเห็นมันijnj

  • เมื่อเราไม่จำเป็นต้องเห็นและไม่มีอะไรเปลี่ยนแปลง เรื่องนี้เกิดขึ้นกับความน่าจะวันj=0ผม0/d

  • เมื่องั้นเราก็ต้องเห็นด้านนี้ ขณะนี้มีด้านที่น้อยกว่าที่ต้องเห็นj คูณและอีกด้านหนึ่งที่ต้องเห็นj - 1ครั้ง ดังนั้นฉันเจกลายเป็นฉันJ - 1และฉันJ - 1กลายเป็นฉันเจ + 1 ให้การนี้กับชิ้นส่วนของผมจะกำหนดให้ฉันเพื่อให้J>0JJ-1ผมJผมJ-1ผมJ-1ผมJ+1ผมผมJ

    ผมJ=(ผม0,...,ผมJ-2,ผมJ-1+1,ผมJ-1,ผมJ+1,...,ผมn).

    เรื่องนี้เกิดขึ้นกับความน่าจะเป็น dผมJ/d

เราเพียงแค่ต้องนับม้วนกระดาษม้วนนี้และใช้การเรียกซ้ำเพื่อบอกให้เราทราบว่ามีม้วนกระดาษเพิ่มอีกกี่ตัว ตามกฎแห่งความคาดหวังและความน่าจะเป็นโดยรวม

อี(ผม)=1+ผม0dอี(ผม)+ΣJ=1nผมJdอี(ผมJ)

(ให้เข้าใจว่าเมื่อใดก็ตามที่คำที่เกี่ยวข้องในผลรวมคือศูนย์)ผมJ=0

ถ้าเราจะทำและอี( ฉัน ) = 0 มิฉะนั้นเราอาจแก้หาe ( i )โดยให้สูตรเรียกซ้ำที่ต้องการผม0=dอี(ผม)=0อี(ผม)

(1)อี(ผม)=d+ผม1อี(ผม1)++ผมnอี(ผมn)d-ผม0.

ขอให้สังเกตว่าคือจำนวนกิจกรรมทั้งหมดที่เราต้องการดู การดำเนินการjช่วยลดปริมาณนั้นหนึ่งสำหรับj > 0ใด ๆ ที่ฉันให้j > 0ซึ่งเป็นกรณีเสมอ ดังนั้นการเรียกซ้ำนี้จึงสิ้นสุดลงที่ระดับความลึกที่แม่นยำ| ฉัน| (เท่ากับ3 ( 6 ) =

|i|=0(i0)+1(i1)++n(in)
jj>0ij>0|i|ในคำถาม) ยิ่งกว่านั้น (เช่นไม่ยากที่จะตรวจสอบ) จำนวนความเป็นไปได้ที่ความลึกของการเรียกซ้ำแต่ละครั้งในคำถามนี้มีขนาดเล็ก (ไม่เกิน 8 ) ดังนั้นนี่เป็นวิธีการที่มีประสิทธิภาพอย่างน้อยที่สุดเมื่อความเป็นไปได้เชิงผสมนั้นไม่มากเกินไปและเราบันทึกผลลัพธ์กลาง (เพื่อไม่ให้มีการคำนวณค่าของ eมากกว่าหนึ่งครั้ง)3(6)=188อี

ฉันคำนวณว่า

อี(0,0,0,6)=22868786045088836998400000000032.677

นั่นดูเล็กมากสำหรับฉันดังนั้นฉันจึงทำการจำลอง (โดยใช้R) หลังจากกว่าสามล้านม้วนของลูกเต๋าเกมนี้ได้รับการเล่นที่จะเสร็จสิ้นในช่วง 100,000 ครั้งโดยมีความยาวเฉลี่ยของ32.669ข้อผิดพลาดมาตรฐานของการประมาณนั้นคือ0.027 : ความแตกต่างระหว่างค่าเฉลี่ยนี้กับค่าทางทฤษฎีไม่มีนัยสำคัญยืนยันความถูกต้องของค่าทางทฤษฎี32.6690.027

การกระจายความยาวอาจเป็นที่สนใจ (เห็นได้ชัดว่ามันจะต้องเริ่มต้นที่จำนวนขั้นต่ำของม้วนที่จำเป็นในการรวบรวมทั้งหกด้านสามครั้งละ)18

รูป

# 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))

การดำเนินงาน

ee(i)ii

RiEij%.%

e

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

(1)1R10

0.01e(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}]

228687860450888369984000000000


5
+1 ฉันคิดว่าสัญกรณ์บางอย่างอาจเป็นเรื่องยากที่จะติดตามสำหรับนักเรียนที่ถูกถามคำถามนี้ (ไม่ใช่ว่าฉันมีทางเลือกที่เป็นรูปธรรมที่จะแนะนำตอนนี้) ในทางกลับกันฉันสงสัยว่าพวกเขาตั้งใจจะทำอะไรกับคำถามแบบนี้
Glen_b -Reinstate Monica

1
@Glen_b พวกเขาสามารถเรียนรู้ได้มากมายโดยการทอยลูกเต๋า (และรับทราบผล) ดูเหมือนว่าเป็นวิธีที่ดีในการทำให้ชั้นเรียนไม่ว่างเป็นเวลาครึ่งชั่วโมงในขณะที่ครูวางตัว :-)
whuber

12

คำถามเดิมของคำถามนี้เริ่มต้นชีวิตโดยการถาม:

จำเป็นต้องมีกี่ม้วนจนกว่าแต่ละด้านจะปรากฏขึ้น 3 ครั้ง

การกระจายของจำนวนม้วนที่ต้องการ ... เพื่อให้แต่ละด้านปรากฏ 3 ครั้ง

nXผมผมผม{1,...,6}(X1,X2,...,X6)พหุ(n,16)

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

ปล่อย: ยังไม่มีข้อความ=นาที{n:Xผม3ผม}.ยังไม่มีข้อความP(ยังไม่มีข้อความn)=P(Xผม3|n)

P(ยังไม่มีข้อความn)n={18,19,20,...}

P(X13,...,X63) ที่ไหน (X1,...,X6)~พหุ(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(ยังไม่มีข้อความn)n

ป้อนคำอธิบายรูปภาพที่นี่

P(ยังไม่มีข้อความ=n)

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนว่าการกระจายไม่มีขอบเขตบน แต่เราสามารถแก้ไขได้อย่างง่ายดายที่นี่สำหรับค่ามากที่สุดเท่าที่จำเป็นในทางปฏิบัติ วิธีการนี้เป็นเรื่องทั่วไปและควรใช้งานได้ดีเช่นกันสำหรับทุกด้านที่ต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.