N 성공까지 어떻게 플립을 모델링 할 수 있습니까?


17

당신과 저는 동전을 뒤집는 게임을하기로 결정했습니다. 총 10 헤드를 뒤집은 첫 번째 플레이어가 게임에서 승리합니다. 당연히 누가 먼저 가야하는지에 대한 논쟁이 있습니다.

이 게임의 시뮬레이션에 따르면 첫 번째로 뒤집는 플레이어는 두 번째로 뒤집는 플레이어보다 6 % 더 많이 이깁니다 (첫 번째 플레이어는 약 53 %의 시간을 이깁니다). 나는 이것을 분석적으로 모델링하는데 관심이있다.

고정 된 횟수의 시행이 없기 때문에 이항 랜덤 변수가 아닙니다 (누군가 10 개의 머리를 얻을 때까지 뒤집기). 이것을 어떻게 모델링 할 수 있습니까? 음 이항 분포입니까?


결과를 다시 만들 수 있도록 파이썬 코드는 다음과 같습니다.

import numpy as np
from numba import jit


@jit
def sim(N):

    P1_wins = 0
    P2_wins = 0

    for i in range(N):

        P1_heads = 0
        P2_heads = 0
        while True:

            P1_heads += np.random.randint(0,2)

            if P1_heads == 10:
                P1_wins+=1
                break

            P2_heads+= np.random.randint(0,2)
            if P2_heads==10:
                P2_wins+=1
                break
    return P1_wins/N, P2_wins/N


a,b = sim(1000000)

3
r 실패 까지 동전을 던지고 그런 실험을 마치기 전에 발생하는 성공 횟수의 분포를 보면 이것은 음의 이항 분포 입니다.

2
2 % 값을 재현 할 수 없습니다. 나는 첫 번째 선수가 승리 찾을 53.290977425133892% 의 시간을.
whuber

1
@ whuber 예, 당신이 옳다고 생각합니다. 시뮬레이션을 필요한 횟수보다 적게 실행했습니다. 내 결과는 당신과 일치합니다.
Demetri Pananos 2012 년

1
한 시간의 53 %를 이기면 다른 하나는 47 %가되어야하므로 설명에서 "첫 번째 플레이어는 두 번째 플레이어보다 6 % 더 많은 승리를 거두었습니다"또는 "시간의 절반보다 3 % 더 많은 승리"? "현재 두 번째로 뒤집는 선수보다 3 % 더
많음

3
FiveThirtyEight Riddler Express 에서이 질문을 받았습니까 ?
foutandabout

답변:


19

달성 전에 꼬리의 수의 분포 의 머리는 음 이항 매개 변수 (10)1 / 2 . 하자 f를 확률 함수되고 G 생존 기능 : 각 N 0 , F ( N ) 의 플레이어의 기회 N 꼬리 전에 헤드와 G ( N ) 의 플레이어의 기회 N 전에 이상의 꼬리 10 개 헤드.10101/2fGn0f(n)n10G(n)n10

플레이어가 독립적으로 굴리기 때문에 첫 번째 플레이어가 정확히 꼬리 를 굴려서 이길 확률은 두 번째 플레이어 가 f ( n ) G ( n ) 과 동일한 n 개 이상의 꼬리를 굴릴 확률을 곱한 결과 입니다.nnf(n)G(n)

가능한 모든 합하면 첫 번째 플레이어의 승리 확률은 다음과 같습니다.n

n=0f(n)G(n)53.290977425133892%.

이는 시간의 절반 이상인 약 입니다.3%

일반적으로 을 양의 정수 m으로 바꾸면 하이퍼 지오메트리 함수로 답을 얻을 수 있습니다.10m

1/2+22m12F1(m,m,1,1/4).

기회가 인 편향 동전을 사용할 때p

12+12(p2m)2F1(m,m,1,(1p)2).

다음은 R그러한 백만 개의 게임에 대한 시뮬레이션입니다. 추정치는 입니다. 이론적 인 결과를 비교하는 이항 가설 테스트의 Z 점수가 - 0.843 사소한 차이입니다.0.53250.843

n.sim <- 1e6
set.seed(17)
xy <- matrix(rnbinom(2*n.sim, 10, 1/2), nrow=2)
p <- mean(xy[1,] <= xy[2,])
cat("Estimate:", signif(p, 4), 
    "Z-score:", signif((p - 0.532909774) / sqrt(p*(1-p)) * sqrt(n.sim), 3))

1
한눈에 알 수없는 메모와 마찬가지로, 우리의 대답은 수치 적으로 동의합니다. (.53290977425133892-.5) * 2는 본질적으로 내가 준 확률입니다.
Dougal

1
@Dougal 지적 해 주셔서 감사합니다. 귀하의 답변을보고 보았으며 질문에 요청 된 답변의 형식과 일치하지 않는 것을 알고 귀하가 올바르게 계산 한 것을 인식하지 못했습니다. 일반적으로 가능한 경우 요청 된 양식으로 질문에 대한 답변을 구성하는 것이 좋습니다. 그러면 답변이 정확하고 비교하기 쉬운시기를 쉽게 인식 할 수 있습니다. 6.6%
whuber

1
@whuber 나는 "이 게임의 시뮬레이션은 첫 번째로 뒤집는 플레이어가 두 번째로 뒤집는 플레이어보다 2 % 더 많은 승리 (편집 : 더 많은 게임을 시뮬레이션 한 후 3 % 더 많은 것)"라는 문구에 응답했습니다. 내가 해석하는 것 "2 %를 승리보다"등의 ; 정확한 값은 실제로 6.6 %입니다. "2 % 이상 승리"를 해석하는 방법이 확실하지 않다면 "시간의 52 % 승리"를 의미하지만, 이것이 의도 된 것입니다. Pr(A wins)Pr(B wins)=2%
Dougal

@Dougal OP의 설명이 혼란스럽고 잘못되었다는 데 동의합니다. 그러나 코드와 그의 결과는 "다른 플레이어보다 3 % 더 많은 시간"보다 "시간의 절반보다 3 % 더 많은 시간"을 의미한다는 것을 분명히했습니다.
whuber

1
@whuber 동의합니다. 불행히도 코드가 게시되기 전에 질문에 대답했으며 시뮬레이션을 직접 실행하지 않았습니다. :)
Dougal

15

다음과 같이 게임을 모델링 할 수 있습니다.

  • 플레이어 A는 결과를 얻고, 반복 동전을 뒤집 1 , 2 , ... 그들은 10 개 머리의 총을 얻을 때까지. 10 번째 헤드의 시간 인덱스가 랜덤 변수 X가되도록 합니다.A1,A2,X
  • 플레이어 B도 마찬가지입니다. 10 번째 헤드의 시간 인덱스 가 X 의 iid 사본 인 랜덤 변수 Y 되도록하십시오 .X
  • 경우 XY , 플레이어 A가 승리; 그렇지 않으면 플레이어 B가 이깁니다. 즉,
    Pr(A wins)=Pr(XY)=Pr(X>Y)+Pr(X=Y)Pr(B wins)=Pr(Y>X)=Pr(X>Y).

승리 속도에 따라서 갭이다

Pr(X=Y)=kPr(X=k,Y=k)=kPr(X=k)2.

XYr=10p=12X10

Pr(X10=k)=(k+9k)210k,
Pr(X=Y)=k=0(k+9k)222k20,
7649952511622614676.6%

Pr(Y>X)46.7%619380496116226146753.3%


머리는 연속 일 필요는 없으며 총 10 개입니다. 나는 그것이 당신이 고치고 있다고 가정합니다.
Demetri Pananos 2012 년

6
(+1)이 방법은 계산이 더 간단하기 때문에 게시 한 방법보다 낫습니다. 확률 함수 만 필요합니다.이 함수는 이항 계수로 간단한 표현을합니다.
whuber

1
I've submitted an edit replacing the last paragraph questioning the difference from the other answer with an explanation of how their results are actually the same.
Monty Harder

1

Let Eij be the event that the player on roll flips i heads before the other player flips j heads, and let X be the first two flips having sample space {hh,ht,th,tt} where h means heads and t tails, and let pijPr(Eij).

Then pij=Pr(Ei1j1|X=hh)Pr(X=hh)+Pr(Ei1j|X=ht)Pr(X=ht)+Pr(Eij1|X=th)Pr(X=th)+Pr(Eij|X=tt)Pr(X=tt)

Assuming a standard coin Pr(X=)=1/4 means that pij=1/4[pi1j1+pi1j+pij1+pij]

solving for pij, =1/3[pi1j1+pi1j+pij1]

But p0j=p00=1 and pi0=0, implying that the recursion fully terminates. However, a direct naive recursive implementation will yield poor performance because the branches intersect.

An efficient implementation will have complexity O(ij) and memory complexity O(min(i,j)). Here's a simple fold implemented in Haskell:

Prelude> let p i j = last. head. drop j $ iterate ((1:).(f 1)) start where
  start = 1 : replicate i 0;
  f c v = case v of (a:[]) -> [];
                    (a:b:rest) -> sum : f sum (b:rest) where
                     sum = (a+b+c)/3 
Prelude> p 0 0
1.0
Prelude> p 1 0
0.0
Prelude> p 10 10
0.5329097742513388
Prelude> 

UPDATE: Someone in the comments above asked whether one was suppose to roll 10 heads in a row or not. So let Ekl be the event that the player on roll flips i heads in a row before the other player flips i heads in a row, given that they already flipped k and l consecutive heads respectively.

Proceeding as before above, but this time conditioning on the first flip only, pk,l=11/2[pl,k+1+pl,0] where pil=pii=1,pki=0

This is a linear system with i2 unknowns and one unique solution.

To convert it into an iterative scheme, simply add an iterate number n and a sensitivity factor ϵ:

pk,l,n+1=1/(1+ϵ)[ϵpk,l,n+11/2(pl,k+1,n+pl,0,n)]

Choose ϵ and pk,l,0 wisely and run the iteration for a few steps and monitor the correction term.

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