Nが成功するまでフリップをモデリングするにはどうすればよいですか?


17

あなたと私は、コインを投げて交代するゲームをすることにしました。最初に合計10個のヘッドをフリップしたプレーヤーがゲームに勝利します。当然、誰が先に行くべきかという議論があります。

このゲームのシミュレーションでは、最初に弾くプレーヤーのほうが2番目に弾くプレーヤーよりも6%多く勝ちます(最初のプレーヤーが約53%勝つ)。これを分析的にモデリングすることに興味があります。

これは二項確率変数ではありません。試行回数が固定されていないためです(誰かが10頭になるまで反転します)。これをどのようにモデル化できますか?負の二項分布ですか?


結果を再作成できるように、ここに私のpythonコードがあります:

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はい、私はあなたが正しいと信じています。シミュレーションを実行した回数が必要以上に少ない。私の結果はあなたのものに見合っています。
デメトリパナノス

1
一方が53%で勝った場合、もう一方は47%でなければなりません。そのため、「最初のプレーヤーが2番目のプレーヤーより6%勝った」、または「半分の時間で3%勝った」という説明はありませんか?ではない(それが現在言うように)「3%以上の第二のフリップをプレイヤーよりも」
JesseM

3
FiveThirtyEight Riddler Expressからこの質問を受け取りましたか?
foutandabout

回答:


19

頭を達成する前の尾の数の分布は、パラメーターおよび負の二項分布です。ましょう確率関数となる生存関数:各、のプレイヤーのチャンスであるの尾前頭とのプレイヤーのチャンスです以上のテールが前に頭。10101/2fGn0f(n)n10G(n)n10

プレイヤーは独立してロールするため、最初のプレイヤーが正確にテールをロールして勝つチャンスは、そのチャンスに2番目のプレイヤーがに等しい以上のテールをロールするチャンスを掛けることによって得られます。nnf(n)G(n)

可能なすべてのを合計すると、最初のプレーヤーの勝率は次のようになります。n

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

これは、半分の時間よりも約大きくなります。3%

一般的に、を任意の正の整数に置き換えると、答えは超幾何関数の観点から与えることができます。10m

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

頭のチャンスでバイアスされたコインを使用するとき、これは一般化するp

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

これRは、100万のそのようなゲームのシミュレーションです。見積もりを報告します。理論結果と比較する二項仮説検定のZスコアはであり、これはわずかな違いです。- 0.8430.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は、本質的に正確に私が与えた確率です。
ドゥーガル

1
@Dougalそれを指摘してくれてありがとう。私はあなたの答えを見て、見ました、そしてそれが質問で要求された答えの形式に同意しないことを知って、私はあなたが正しく計算したことを認識しませんでした。一般に、可能であれば、要求されたフォームの質問への回答をフレーム化することをお勧めします。これにより、回答が正しいかどうかを簡単に認識し、回答を比較しやすくなります。6.6%
whuber

1
@whuber「このゲームのシミュレーションでは、最初にフリップするプレーヤーが2番目にフリップするプレーヤーよりも2%(編集:より多くのゲームをシミュレートした後、3%多い)を獲得する」というフレーズに応答していました。「勝つ2%以上」をと解釈します。実際、正しい値は6.6%です。「2%以上勝つ」とは「52%の勝率」を意味すると解釈する方法がわかりませんが、明らかにそれが意図されたものです。Pr(A wins)Pr(B wins)=2%
ドゥーガル

@Dougal OPの説明が混乱を招き、間違っていることにさえ同意します。しかし、コードと彼の結果は、「他のプレイヤーよりも3%多い」というよりも、「半分の時間よりも3%多い」ことを意味していることを明らかにしました。
whuber

1
@whuber同意しました。残念ながら、コードが投稿される前に質問に答えたので、自分でシミュレーションを実行しませんでした。:)
Dougal

15

次のようにゲームをモデル化できます。

  • プレイヤーAはコインを繰り返しひっくり返し、合計10個のヘッドを獲得するまで結果を取得します。10番目のヘッドの時間インデックスをランダム変数ます。A1,A2,X
  • プレイヤーBも同様です。10番目のヘッドの時間インデックスをランダム変数とします。これは iidコピーです。YX
  • 場合、プレイヤーAが勝ちます。それ以外の場合は、プレーヤーBが勝ちます。つまり、XY
    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.

ご想像のとおり、(および)は、本質的に負の二項分布に従って分布しています。この表記法はさまざまですが、ウィキペディアのパラメーター化では、「失敗」としての頭と「成功」としての尾があります。我々は必要なの実験が停止する前に、「失敗」(頭)、および成功確率。次に、「成功」の数であるには、 あり、衝突確率は これはMathematicaがと便利に言うXYr = 10 p = 1r=10p=12X10

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

したがって、プレーヤーBの勝率はであり、プレーヤーAは。Pr(Y>X)46.7%619380496116226146753.3%


頭は一列に並んでいる必要はなく、合計10個だけです。私はそれがあなたが修正しているものだと思います。
デメトリパナノス

6
(+1)このアプローチは、計算が簡単であるため、投稿したアプローチよりも優れています。2項係数の観点で単純な式を持つ確率関数のみが必要です。
whuber

1
私は、他の回答との違いを疑問視する最後の段落を、それらの結果が実際に同じである方法の説明で置き換えて編集を提出しました。
モンティハーダー

1

LET他のプレイヤがJヘッドを反転する前に、ロール上のプレイヤーが私の頭を反転した場合であり、およびlet二つの試料空間を有するフリップ最初にここで、h手段ヘッドおよびtテール、およびます。EijX{hh,ht,th,tt}pijPr(Eij)

次に、 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)

標準コインをすると、Pr(X=)=1/4pij=1/4[pi1j1+pi1j+pij1+pij]

解く、pij=1/3[pi1j1+pi1j+pij1]

ただし、およびであり、再帰が完全に終了することを意味します。ただし、直接的な単純な再帰的実装では、ブランチが交差するためパフォーマンスが低下します。p0j=p00=1pi0=0

効率的な実装には、複雑度とメモリの複雑度ます。Haskellに実装された簡単なフォールドは次のとおりです。O(ij)O(min(i,j))

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> 

更新:上記のコメントの誰かが、10個のヘッドを連続してロールすることになっているかどうかを尋ねました。そうせ他のプレイヤーは、彼らが既にそれぞれKおよびLの連続ヘッドを反転することを考えると、行i内のヘッドを反転する前に、ロール上のプレイヤーが一列に私のヘッドを反転させた場合です。Ekl

上記のように進みますが、今回は最初のフリップのみの条件付け、 ここでpk,l=11/2[pl,k+1+pl,0]pil=pii=1,pki=0

これは、未知数と1つのユニークなソリューションを持つ線形システムです。i2

反復スキームに変換するには、反復数と感度係数追加するだけです:nϵ

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

とを賢明に選択し、数ステップの反復を実行し、補正項を監視します。 ϵpk,l,0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.