【桃太郎電鉄検証】サイコロの数が5個と10個の目の和で勝負した際に5個の側が勝つ確率

上記で複数サイコロの確率の計算に関して取り扱いましたが、結果を応用することでサイコロの数が異なるサイコロ勝負の確率を計算することができます。具体的には桃太郎電鉄でサイコロ$5$個と$10$個のサイコロ勝負があるので、当記事では$5$個の側が勝利する確率に関して以下計算を行います。

・ゲーム × 統計 まとめ
https://www.hello-statisticians.com/game_stat

基本的な考え方

$1$個と$2$個の場合

$1$個のサイコロの出目を確率変数$X$、$2$個のサイコロの出目の和を確率変数$Y$でおきます。このときそれぞれの確率分布は確率関数$p(x)$と$p(y)$を用いて下記のように表すことができます。

$X$$1$$2$$3$$4$$5$$6$
$p(x)$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$$\displaystyle \frac{1}{6}$
$Y$$2$$3$$4$$5$$6$$7$$8$$9$$10$$11$$12$
$p(y)$$\displaystyle \frac{1}{6^2}$$\displaystyle \frac{2}{6^2}$$\displaystyle \frac{3}{6^2}$$\displaystyle \frac{4}{6^2}$$\displaystyle \frac{5}{6^2}$$\displaystyle \frac{6}{6^2}$$\displaystyle \frac{5}{6^2}$$\displaystyle \frac{4}{6^2}$$\displaystyle \frac{3}{6^2}$$\displaystyle \frac{2}{6^2}$$\displaystyle \frac{1}{6^2}$

このとき$X>Y$となる確率$P(X>Y)$は下記のように計算できます。
$$
\begin{align}
& P(X>Y) = P(X=3, Y=2) + P(X=4, Y \leq 3) + P(X=5, Y \leq 4) + P(X=6, Y \leq 5) \\
&= P(X=3)P(Y=2) + P(X=4)P(Y \leq 3) + P(X=5)P(Y \leq 4) + P(X=6)P(Y \leq 5) \\
&= \frac{1}{6}(P(Y=2) + P(Y \leq 3) + P(Y \leq 4) + P(Y \leq 5)) \\
&= \frac{1}{6} \left( \frac{1}{6^2} + \frac{2}{6^2} + \frac{3}{6^2} + \frac{4}{6^2} \right) \\
&= \frac{1}{6} \times \frac{20}{6^2} = \frac{5}{54} = 0.09259…
\end{align}
$$

上記より$P(X>Y)$は約$9.3$%ほどの確率であることが確認できます。

確率計算にあたっての考え方

前項で確認を行なったように、ここでの確率計算にあたってはそれぞれの出目を確率変数$X,Y$で表し、確率関数$p(x), p(y)$を元に確率分布を考えるとわかりやすいです。$X$のそれぞれの値に対し、$Y$が下回る確率を考えることで、同時分布の分解の要領で計算を行うことができます。

$n$個 vs $2n$個

計算プログラム

前節の内容を元に下記のようにプログラムを作成することができます。

n1, n2 = 1, 2
m = 6

def extend_dist(dist_dict, m):
    new_dist_dict = {}
    for i in range(dist_dict.keys()[0]+1,dist_dict.keys()[-1]+1+m):
        new_dist_dict[i] = 0
    for key in dist_dict.keys():
        for i in range(m):
            new_dist_dict[key+i+1] += dist_dict[key]/float(m)
    return new_dist_dict

prob_init = {}
for i in range(m):
    prob_init[i+1] = 1/float(m)

prob1, prob2 = prob_init, prob_init
for i in range(n1-1):
    prob1 = extend_dist(prob1, m)

for i in range(n2-1):
    prob2 = extend_dist(prob2, m)

prob = 0.

for i in range(n2+1,n1*6+1):
    for j in range(n2,i):
        prob += prob1[i]*prob2[j]

print("Probability: {:.3f}".format(prob))

・実行結果

Probability: 0.093

上記のプログラムでは下記で作成したプログラムを用いて複数サイコロの出目の和に関する確率分布の計算を行ないました。

$n$個 vs $2n$個

前項のプログラムを$n1=3, n2=6$と$n1=5, n2=10$で実行すると下記が得られます。

・$n1=3, n2=6$

Probability: 0.015

・$n1=5, n2=10$

Probability: 0.0028

上記より、サイコロ$5$個の出目の和がサイコロ$10$個の出目の和を上回る確率は$0.28$%であることが確認できます。