모든면을 최소한 한 번 이상 얻기 위해 얼마나 자주 6 면체 주사위를 굴려야합니까?


41

나는 방금 내 아이들과 게임을 해봤는데 기본적으로 다음과 같이 요약됩니다.

나는 결국 이겼고 다른 사람들은 1-2 턴 후에 끝냈다. 이제 궁금합니다 : 게임의 길이에 대한 기대는 무엇입니까?

특정 숫자에 도달 할 때까지 롤 수에 대한 기대치는 n = 1 n 1 임을 알고 있습니다. n=1n16(56)n1=6이다.

그러나 두 가지 질문이 있습니다.

  1. 최소한 한 번 이상 모든 숫자를 얻을 때까지 6 면체 주사위를 몇 번 굴려야합니까?
  2. 네 번의 독립적 인 시험 (즉, 네 명의 선수를 대상으로 한 시험) 중에서 필요한 최대 롤 수는 얼마입니까? [참고 : 나이에 따라 내 아이들을 위해 먼저 도착하는 것보다 마무리하는 것이 더 많기 때문에 최소가 아닌 최대 값입니다.]

결과를 시뮬레이션 할 수는 있지만 분석적으로 계산하는 방법에 대해 궁금합니다.


Matlab의 Monte Carlo 시뮬레이션은 다음과 같습니다.

mx=zeros(1000000,1);
for i=1:1000000,
   %# assume it's never going to take us >100 rolls
   r=randi(6,100,1);
   %# since R2013a, unique returns the first occurrence
   %# for earlier versions, take the minimum of x
   %# and subtract it from the total array length
   [~,x]=unique(r); 
   mx(i,1)=max(x);
end

%# make sure we haven't violated an assumption
assert(numel(x)==6)

%# find the expected value for the coupon collector problem
expectationForOneRun = mean(mx)

%# find the expected number of rolls as a maximum of four independent players
maxExpectationForFourRuns = mean( max( reshape( mx, 4, []), [], 1) )

expectationForOneRun =
   14.7014 (SEM 0.006)

maxExpectationForFourRuns =
   21.4815 (SEM 0.01)

11
쿠폰 수집기의 문제는 또한 참조 - 인터넷 검색을하는 것은 당신에게 더 많은 안타와 더 많은 정보를 제공 할 것입니다. 또한 stats.SE에서 검색 하십시오 .
Glen_b

1
@ Glen_b : 고마워, 나는 그 이름을 몰랐다!
Jonas

1
@ whuber : 나는이 질문이 종결되었는지 확실하지 않습니다. 그는 네 번의 시도로 예상되는 최소 타격 시간을 원합니다. 동적 프로그래밍 솔루션에 대한 답변을 수정하려고했습니다.
Neil G

2
@ whuber : 나는 명확하게 게시물을 편집합니다
Jonas

3
관련 math.SE 게시물 : 쿠폰 수집기 문제의 확률 분포
Glen_b

답변:


22

"완전히 분석적인 접근 방식"이 요청되었으므로 여기에 정확한 해결책이 있습니다. 또한 교체 조건이 혼합 된 일련의 흑백 볼에 블랙 볼을 그릴 가능성에 대한 질문을 해결하기위한 대체 방법을 제공합니다 .


게임에서 이동 횟수 X , 기하학적 여섯 독립적 실현의 합으로서 모델링 될 수있다 (p) 확률 변수들 p=1,5/6,4/6,3/6,2/6,1/6 , 이들 각각은 1 만큼 시프트되었다 (기하학적 변수는 의 롤만을 카운트하기 때문에성공과 우리는 또한 성공이 관찰 된 롤을 세어야합니다.) 기하 분포로 계산함으로써 원하는 답 보다 6 적은 답을 얻을 수 있으므로 끝에 6 다시 추가해야합니다 .

모수 p를 갖는 이러한 기하 변수확률 생성 함수 (pgf) 는p

f(z,p)=p1(1p)z.

따라서이 6 가지 변수의 합에 대한 pgf는

g(z)=i=16f(z,i/6)=6z4(5 2z+5+10 3z+45 4z+4+5z+4+5).

(제품은 부분 분수 를 통해 5 개의 항으로 분리하여이 닫힌 형태로 계산할 수 있습니다 .)

gz

F(z)=6z4((1) 1z+4+(5) 2z+4(10) 3z+4+(10) 4z+4(5) 5z+4+(1) 6z+4).

(나는이 표현 을 포함-제외 원칙을 통한 대체 도출을 제안하는 형태로 썼다 .)

이것으로부터 우리는 게임에서 예상되는 움직임의 수를 얻습니다 (첫 번째 질문에 대답).

E(6+X)=6+i=1(1F(i))=14710.

mXF(z)mm=4

6+i=1(1F(i)4)21.4820363.

6.77108.6

그림

18500.3%


이 솔루션 방법은 기하 변수의 합이 동일한 매개 변수를 갖는 기하 변수의 혼합 (음의 가중치와 함께)이라는 관측에서 영감을 받았습니다. 감마 변수 (속도 매개 변수가 다른) 간에도 비슷한 관계가 있습니다 . Mathematica 에서 작업을 한 것에 대해 사과 하지만 Matlab도 이러한 계산을 수행 할 수 있다고 확신합니다 :-).
whuber

2
이것이 내가 기대했던 대답입니다. 대단히 감사합니다! Matlab에서 숫자 결과를 계산할 수 있어야한다고 생각합니다. :)
Jonas

는 어떻게f(z,p)=p1(1p)zi=16f(z,i/6)F(z)g(z)

1
f(z,p)

@MartijnWeterings 감사합니다. 더 정확하고 일반적인 용어입니다. (함수 생성 기능을 사용하는 습관이 길기 때문에 pmf와 pgf를 거의 같은 것으로 생각하는 경향이 있음을 알 수 있습니다.)이 게시물의 용어를 변경하겠습니다.
whuber

13

{0,,6}ii6ii+16i6

i=0566i=14.7

(6,6,6,6)jiTiijpipijij. 동적 프로그래밍으로 적중 시간과 확률을 발견 할 수 있습니다. 타격 시간과 확률을 채우는 순회 명령이 있기 때문에 그렇게 어렵지 않습니다. 예를 들어, 두 다이의 경우 : 먼저 (0,0), (1,0), (1, 1), (2, 0), (2, 1) 등에 대해 T와 p를 계산합니다.

파이썬에서 :

import numpy as np
import itertools as it
from tools.decorator import memoized  # A standard memoization decorator

SIDES = 6

@memoized
def get_t_and_p(state):
    if all(s == 0 for s in state):
        return 0, 1.0
    n = len(state)
    choices = [[s - 1, s] if s > 0 else [s]
               for s in state]
    ts = []
    ps = []
    for last_state in it.product(*choices):
        if last_state == state:
            continue
        last_t, last_p = get_t_and_p(tuple(sorted(last_state)))
        if last_p == 0.0:
            continue
        transition_p = 1.0
        stay_p = 1.0
        for ls, s in zip(last_state, state):
            if ls < s:
                transition_p *= (SIDES - ls) / SIDES
            else:
                transition_p *= ls / SIDES
            stay_p *= ls / SIDES
        if transition_p == 0.0:
            continue
        transition_time = 1 / (1 - stay_p)
        ts.append(last_t + transition_time)
        ps.append(last_p * transition_p / (1 - stay_p))
    if len(ts) == 0:
        return 0, 0.0
    t = np.average(ts, weights=ps)
    p = sum(ps)
    return t, p

print(get_t_and_p((SIDES,) * 4)[0])

1
네 번의 독립적 인 게임 회귀에서 예상되는 최대 롤 수를 놓쳤습니다.
probabilityislogic

아, 방금 알았습니다. 나는 당신이 최소한을 의미한다고 생각하지만, 그렇습니다.
Neil G

@ NeilG : 전략이 최소와 최대에 대해 동일하다고 가정하지만 실제로 최대를 의미합니다 (업데이트 된 질문 참조). 동적 프로그래밍 전략에 대해 자세히 설명해 주시겠습니까?
Jonas

@Jonas : 최대로 업데이트되었습니다. 많은 일이 있지만 나중에 이것을 위해 코드를 작성할 수 있습니다.
Neil G

2
@ NeilG : 감사합니다. 나는 완전히 분석적인 접근을 원했지만 DP 코드도 꽤 지시적입니다.
Jonas

6

1 명의 플레이어를위한 게임 길이의 R에서 빠르고 더러운 Monte Carlo 추정치 :

N = 1e5
sample_length = function(n) { # random game length
    x = numeric(0)
    while(length(unique(x)) < n) x[length(x)+1] = sample(1:n,1)
    return(length(x))
}
game_lengths = replicate(N, sample_length(6))

μ^=14.684σ^=6.24[14.645,14.722]

4 인 게임의 길이를 결정하기 위해 샘플을 4 개로 그룹화하고 각 그룹에 대한 평균 최소 길이를 취할 수 있습니다 (최대 값에 대해 물 었으나 읽은 방식, 최소값을 의미한다고 가정합니다). 누군가가 모든 숫자를 얻는 데 성공하면 게임이 끝납니다) :

grouped_lengths = matrix(game_lengths, ncol=4)
min_lengths = apply(grouped_lengths, 1, min)

μ^=9.44σ^=2.26[9.411,9.468]


1
Matlab 시뮬레이션과 비슷한 결과를 얻었지만 분석적으로 어떻게 해결할지 궁금했습니다. 또한 아이들과 게임을하기 때문에 누가이기 든 상관없이 모두 게임을 끝내고 싶어서 최대 값에 대해 묻고 싶습니다.
Jonas

5

m

T1=6
Tm=1+6m6Tm+m6Tm1

m1

  • Tm6m6m6
  • Tm1mm6

14.7


Ti=Ti1+66i+1

1
네, 죄송합니다, 실수를 저질렀습니다
ThePawn

답변을 추가해도 괜찮습니다. 14.7은 맞지만 재발 관계는 여전히 결함이있다…
Neil G

문제 없습니다. 처음 조심해야했습니다 :). 당신의 대답은 훌륭합니다.
ThePawn

5

첫 번째 질문에 대한 간단하고 직관적 인 설명 :

먼저 숫자를 굴려야합니다. 이것은 쉬우 며, 항상 정확히 1 롤이 필요합니다.

5665

4664

3663

그리고 6 번째 롤을 성공적으로 완료 할 때까지 계속합니다.

66+65+64+63+62+61=14.7 rolls

이 답변은 Markov 체인이없는 Neil G의 답변과 유사합니다.


1

다음 새로운 숫자를 얻기위한 확률 밀도 함수 (또는 이산 등가)는 다음과 같습니다.

f = 합 (p * (1-p) ^ (i-1), i = 1 .. inf)

여기서 p는 롤당 확률, 숫자가 롤링되지 않은 경우 1, 1 이후 5/6, 4/6 .. 마지막 숫자의 경우 1/6까지입니다.

기대 값 mu = sum (i * p * (1-p) ^ (i-1), i = 1 .. inf) n = i-1을 허용하고 p를 합산 밖으로 가져옵니다.

mu = p * sum ((n + 1) * (1-p) ^ n, n = 0 .. inf)

mu = p * sum (n (1-p) ^ n, n = 0 .. inf) + p * sum ((1-p) ^ n, n = 0 .. inf) mu = p * (1-p ) / (1-p-1) ^ 2 + p * 1 / (1- (1-p))

mu = p * (1-p) / p ^ 2 + p / p

mu = (1-p) / p + p / p

mu = (1-p + p) / p

mu = 1 / p

1, 5/6, 4/6, 3/6, 2/6 및 1/6의 ps에 대한 예상 값 (mus)의 합은 이전에보고 된대로 14.7이지만 필요한 수당 1 / p는 일반적입니다 다이 사이즈

마찬가지로, 표준 편차를 분석적으로 계산할 수 있습니다

sigma ^ 2 = sum ((i-mu) ^ 2 * p * (1-p) ^ (i-1), i = 1 .. inf)

나는 여기에 당신에게 대수를 절약 할 것입니다.

6의 경우, 각 단계에 대한 시그마 ^ 2의 합은 다시 시뮬레이션 된 것처럼 약 6.24의 표준 편차에 대해 38.99입니다.


-4

질문 1은 :

모든 숫자를 한 번 이상 얻을 때까지 6면 주사위를 몇 번 굴려야합니까?

분명히 정답은 '무한'이어야합니다.


6
그것은``모든 숫자를 적어도 한 번 얻을 수 있도록 절대 확실성을 보장하는 것 ''이라는 질문에 대한 대답입니다. 질문에 대한 답은 무작위 변수이며 분포는 대략적으로 근사 할 수 있습니다.
Glen_b
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.