ヨットでBストレートが達成される確率

本記事はヨットでBストレートが達成される確率に関する記事です.

目的は,Bストレートが達成される確率を最大にする戦略を明らかにし,その場合の確率を求めることです.

『世界のアソビ大全51』における呼称にならい,Bストレートとは出目が12345または23456となることを指します.

解法

動的計画法で解きます.

\mathrm{dp}[i][j][k][l]=(i 回の振り直しが残っていて,j 個の目が不確定で,2,3,4,5のうち k 種類の数字が揃っていて,l=(1,6の少なくとも一方が揃っている)である場合にBストレートとなる確率) とします.

例えば,通常のルールにおいて1ラウンドでBストレートだけを狙った場合にそれが達成される確率は,\mathrm{dp}[2][5][0][0]=\frac{319695199}{1224440064}\approx0.261 となります.

遷移についてはコードを見てください.振り直しの際に k を減らすような遷移は最適となりえないため省いています.

from fractions import Fraction

# 振り直しの回数
N = 2

dp = [[[[Fraction(0)] * 2 for k in range(5)] for j in range(6)] for i in range(N+1)]
dp[0][0][4][1] = Fraction(1)

for i in range(N+1):
    for j in range(6):
        for k in range(5):
            for l in range(2):
                if j == 0:
                    if i > 0:
                        for l_ in range(l+1):
                            dp[i][j][k][l] = max(dp[i-1][5-k-l_][k][l_], dp[i][j][k][l])
                else:
                    p = Fraction(k+2*l, 6) * dp[i][j-1][k][l]
                    if k < 4:
                        p += Fraction(4-k, 6) * dp[i][j-1][k+1][l]
                    if l < 1:
                        p += Fraction(2, 6) * dp[i][j-1][k][l+1]
                    dp[i][j][k][l] = p

print(dp[N][5][0][0]) # 319695199/1224440064
print(float(dp[N][5][0][0])) # 0.26109501673411434

戦略

\left(i, k\right) に対し \mathrm{dp}[i-1][5-k][k][0]\mathrm{dp}[i-1][4-k][k][1] を比較することで,1,6を戻すべきか否かを決定できます.前者が大きければ戻すべきとなります.

i=1 の場合,k\leq1 なら戻すべきで,k=2 なら等しく,k\geq3 なら戻さないべきです.

i=2 の場合,k\leq2 なら戻すべきで,k\geq3 なら戻さないべきです.

i\geq3 の場合,k\leq3 なら戻すべきで,k=4 なら戻さないべきです.

通常のルールで i\geq3 とはならないので,k\leq2 なら戻し,k\geq3 なら戻さないとすれば最適であることがわかります.

各状態における値

不確定の目が存在しない場合の値です.したがって \left(k,l\right)=\left(0,0\right) とはなりえません.

i=1i=2
\left(k,l\right)=\left(0,1\right)0.0310.130
\left(k,l\right)=\left(1,0\right)0.0370.146
\left(k,l\right)=\left(1,1\right)0.0370.146
\left(k,l\right)=\left(2,0\right)0.0560.184
\left(k,l\right)=\left(2,1\right)0.0560.184
\left(k,l\right)=\left(3,0\right)0.1110.278
\left(k,l\right)=\left(3,1\right)0.1670.306
\left(k,l\right)=\left(4,0\right)0.3330.556
\left(k,l\right)=\left(4,1\right)1.0001.000

上部へスクロール