각면이 3 번 나타날 때까지 주사위를 굴릴 것으로 예상 된 횟수


15

각면이 3 번 나타날 때까지 주사위를 굴려야하는 예상 횟수는 얼마입니까?

이 질문은 뉴질랜드의 초등학교에서 요청되었으며 시뮬레이션을 사용하여 해결되었습니다. 이 문제에 대한 분석 솔루션은 무엇입니까?


6
롤의 결과는 임의적이기 때문에 필요한 롤 수를 미리 알 수는 없습니다. 예를 들어, 질문이 각면이 3 번 나오기 전에 예상되는 롤 수를 찾고 있다면 명시 적으로 언급해야합니다. 이 경우 stats.stackexchange.com/tags/self-study/info가 적용됩니다.
Juho Kokkala

3
뉴질랜드 어린이들에게 Norman L. Johnson, Samuel Kotz, N. Balakrishnan "Discrete Multivariate Distributions" wiley.com/WileyCDA/WileyTitle/productCd-0471128449.html을 읽게하십시오 .
Mark L. Stone

답변:


28

모든 변의 기회가 같다고 가정합니다 . 1 면 이 n 1 번 나타날 때까지 , 2 면 이 n 2 번 나타날 때까지 , 그리고 d 면 이 n d 번 나타날 때까지 필요한 롤 수를 일반화하고 찾으십시오 . 측면의 정체성 문제가되지 않기 때문에,이 목표의 설명이 응축 될 수있다 (그들은 모두 동등한 기회가) : 우리가 있다고 가정하자 내가 0 양쪽 모두에 표시하지 않아도, 내가 변의를 표시해야합니다 한 번만 ..., 그리고 nd=61n12n2dnd나는0나는1나는변의 번 나타나야 합니다. 하자 = ( I 0 , i가 1 , ... , i가 N ) ,이 상황과 기입 지정 E ( I ) 롤의 예상 된 수를 들어. 질문은 e ( 0 , 0 , 0 , 6 )를 요청합니다 . i 3 ==최대(1,2,,)

나는=(나는0,나는1,,나는)
이자형(나는)
이자형(0,0,0,6) 은 6 개의면이 각각 3 번씩 표시되어야 함을 나타냅니다.나는=6

쉬운 재발이 가능합니다. 다음 롤 중 하나와 일치 나타나는 측면에서 :이며, 하나 우리는 그것을 볼 필요하지 않았거나 우리는 ... 한 번 볼 필요가 또는 우리는 그것을 볼 필요 N 더 타임스. j 는 우리가 그것을 보는 데 필요한 횟수입니다.나는제이제이

  • 일 때 , 우리는 그것을 볼 필요가 없었으며 아무것도 변하지 않았습니다. 이것은 확률 i 0 / d에서 발생 합니다.제이=0나는0/

  • 이면 을 볼 필요가있었습니다. 이제 j 배 를 볼 필요가있는 한 쪽 과 j - 1 회를 볼 수있는 쪽이 하나 더 있습니다 . 따라서 i ji j - 1이 되고 i j - 1i j + 1이 됩니다. i 의 구성 요소에 대한이 작업을 ij 로 지정 하여제이>0제이제이1나는제이나는제이1ij1ij+1iij

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

    이 확률로 발생 .ij/d

우리는 단지이 다이 롤을 세고 재귀를 사용하여 얼마나 많은 롤이 예상되는지 알려 주면됩니다. 기대 법칙과 총 확률에 의해

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

( 일 때 합계의 해당 항은 0이라는 것을 이해 하십시오.)ij=0

경우 , 우리는 완료하고 E ( I ) = 0 . 그렇지 않으면 우리는 원하는 재귀 공식을 제공하여 e ( i )를 풀 수 있습니다.i0=de(i)=0e(i)

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

공지 사항이 은보고자하는 총 이벤트 수입니다. j 연산 은 i j > 0 이면 j > 0에 대해 수량을 1 씩 줄입니다 ( 항상 그렇습니다). 따라서이 재귀는 정확하게 | 나는 | (동일한 행 3 ( 6 ) =

|i|=0(i0)+1(i1)++n(in)
jj>0ij>0|i|질문에 18 ). 또한 (확인하기 어렵지 않기 때문에)이 질문의 각 재귀 깊이에서 가능성의 수는 적습니다 ( 8을 초과하지 않음). 결과적으로, 이것은 조합 가능성이 너무 많지 않고 중간 결과를 기억할 때 ( e의 값이두 번 이상 계산되지 않을 때) 효율적인 방법입니다.3(6)=188e

나는

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

그것은 나에게 아주 작게 보였으므로 시뮬레이션을 사용했다 R. 3 백만 롤 이상의 주사위를 굴린 후이 게임은 평균 길이 100,000 회 이상 완료되었습니다 . 이 추정치의 표준 오차는 0.027입니다 .이 평균과 이론 값의 차이는 중요하지 않으므로 이론 값의 정확성을 확인합니다.32.6690.027

길이 분포에 관심이있을 수 있습니다. (반드시 부터 시작해야합니다 . 최소 6 개의 롤을 각각 3 번씩 모아야합니다.)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))

이행

의 재귀 계산 은 간단 하지만 일부 컴퓨팅 환경에서는 몇 가지 문제가 있습니다. 이들 중 가장 중요한 것은 e ( i ) 값을 계산할 때 저장하는 것입니다 . 그렇지 않으면 각 값이 (중복 적으로) 매우 많은 횟수로 계산되므로 필수적입니다. 그러나 i 가 색인을 생성 한 어레이에 잠재적으로 필요한 스토리지 는 막대 할 수 있습니다. 이상적으로 계산 중에 실제로 발생하는 i 값만 저장해야합니다. 이것은 일종의 연관 배열을 요구합니다.ee(i)ii

설명을 위해 여기에 작업 R코드가 있습니다. 주석은 중간 결과를 저장하기위한 간단한 "AA"(연관 배열) 클래스 작성을 설명합니다. 벡터 는 문자열로 변환되며 모든 값을 보유 하는 목록으로 색인하는 데 사용 됩니다. IJ의 동작으로 구현된다 .iEij%.%

이러한 예비를 통해 재귀 함수 를 수학 표기법과 비슷한 방식으로 간단하게 정의 할 수 있습니다. 특히, 라인e

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

는 상기 식 과 직접 비교된다 . 배열의 인덱스를 0이 아닌 1 부터 시작 하기 때문에 모든 인덱스가 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-복지 모니카

1
@Glen_b 실제로 주사위를 굴려서 결과를 계산함으로써 많은 것을 배울 수있었습니다. 선생님이 쉬는 동안 반 시간 동안 수업을 바쁘게하는 좋은 방법처럼 들립니다. :-).
whuber

12

이 질문의 원래 버전은 다음과 같은 질문으로 시작되었습니다.

각면이 3 번 나타날 때까지 필요한 롤 수

각 롤이 3 번 나타나도록 필요한 롤 수 분포 ...

nXiii{1,,6}(X1,X2,,X6)Multinomial(n,16) i.e.:

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

Let: N=min{n:Xi3i}. Then the cdf of N is: P(Nn)=P(Xi3|n)

i.e. To find the cdf P(Nn), simply calculate for each value of n={18,19,20,}:

P(엑스1,,엑스6) 어디 (엑스1,,엑스6)다항식(,16)

예를 들어, Mathematica 코드는 다음과 같습니다. 18에서 60으로 증가합니다. 기본적으로 하나의 라이너입니다.

 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}]

... 정확한 cdf를 증가합니다 :

1814889875110199605761928290762544079842304203111983875176319369216211168408491253173748645888223283142988125507799783342082361483465418375609359740010496

다음은 cdf의 도표입니다 ()의 함수로서 :

여기에 이미지 설명을 입력하십시오

pmf를 도출하려면 (=), 단순히 cdf를 먼저 차이점 :

여기에 이미지 설명을 입력하십시오

물론 분포에는 상한이 없지만 실제로 필요한만큼의 값으로 쉽게 해결할 수 있습니다. 이 접근법은 일반적이며 필요한 측면 조합에 대해서도 잘 작동해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.