simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Hearthstone: ハースストーンのスプリットダメージの期待値 その3

前回の続きです。
スプリットダメージの回数3の場合の各カードの撃破率を様々な盤面で見ていきます。

simplestar-tech.hatenablog.com

■問題1
場に2枚のカードがあり
1枚目のカードのライフは1
2枚目のカードのライフは3
★答え1
1枚目のライフ1のカードの撃破率は 7/8
2枚目のライフ3のカードの撃破率は 1/8

1枚目のライフ1のカードをAとします。
Aが一回目のダメージで撃破される確率は 1/2 です。
二回目のダメージで撃破される確率は 1/4 です。
1/2 の確率で生き残った後、場に 2 枚ある状態でダメージを受ける確率なので
1/2 * 1/2
Aが一回目と二回目のダメージいずれかで撃破される確率は
1/2 + 1/2 * 1/2 = 3/4
前回のプログラムでここまでの計算はできます。
プログラムは 0.75 と答えました。つまり 3/4 ですね。あっています。
Aが三回目のダメージで撃破される確率は 1/8
1/2 で一回目を生き残り 1/2 で二回目を生き残った後、場に 2 枚ある状態でダメージを受ける確率なので
1/2 * 1/2 * 1/2
ところで、一回目と二回目のダメージいずれかで撃破される確率と、二回目を終えても生き残っている確率の合計は 1 なので
1/2 で一回目を生き残り 1/2 で二回目を生き残った後、という表現は次のように求めても値は変わりません。
(1 - 3/4)
よって三回目で撃破される確率は、次の計算を行いました。
(1 - 3/4) * 1/2
まとめると
Aが一回目と二回目の三回目のダメージいずれかで撃破される確率は
1/2 + 1/2 * 1/2 + (1 - 3/4) * 1/2 = 7/8

2枚目のライフ3のカードをBとします。
Bが一回目のダメージで撃破される確率は 0 です。
Bがニ回目のダメージで撃破される確率は 0 です。
Bが三回目のダメージで撃破される確率は 1/8 です。
Bをダメージ回数3で撃破するには、すべてのダメージをこのBに当てなければなりません。
場に 2 枚ある状態はずっと変わりませんので
1/2 * 1/2 * 1/2 = 1/8
と計算できます。

■問題2
場に3枚のカードがあり
1枚目のカードのライフは1
2枚目のカードのライフは2
3枚目のカードのライフは3
★答え2
1枚目のライフ1のカードの撃破率は 0.72222225
2枚目のライフ2のカードの撃破率は 0.32407407
3枚目のライフ3のカードの撃破率は 1/27

1枚目のライフ1のカードについて
前回までの知識を使えば 1枚目のライフ1のカードが2回目までに撃破される確率は 0.5555556
1 - 0.5555556 という確率で生き残った後、3回目に撃破される可能性は、
場のカードの数に変動がなければ 1/3
ライフ2のカードが撃破されていたら場のカードの数が 2 に減っているので 1/2
となります
場のカードの枚数ごとの確率がほしくなりましたので計算します。
これは場に2枚のカードがあり、ライフ2と3のカードで構成されているところに、2回のスプリットダメージを与える問題ですので
2枚目のライフ2のカードをダメージ回数2で撃破できる確率は、前回のプログラムを使って 0.25 つまり 1/4 です。
3枚目のライフ3のカードをダメージ回数2で撃破できる確率は、前回のプログラムを使って 0 です。
撃破される可能性のあるカードは1枚で、その確率が 1/4 なので
場のカードの数が 2 に減っている確率は 1/4
場のカードの数に変動がない確率は 1 - 1/4
なので3回目に撃破される可能性は
(1 - 0.5555556) * (1/4 * 1/2 + (1 - 1/4) * 1/3) = (1 - 0.5555556) * 3/8 = 0.16666665
よってカードが1回目、2回目、3回目いずれかで撃破される可能性は
0.5555556 + 0.16666665 = 0.72222225

2枚目のライフ2のカードについて
前回までの知識を使えば 2回目までに撃破される確率は 0.111111119
1 - 0.111111119 という確率で生き残った後、3回目に撃破される可能性は、
場のカードの数に変動がなければ 1/3
ライフ1のカードが撃破されていたら場のカードの数が 2 に減っているので 1/2
となります
場のカードの枚数ごとの確率がほしくなりましたので計算します。
ライフ1のカードのように計算できないところに注意です。
なぜなら、これは場に2枚のカードがあり、ライフ1と3のカードで構成されているところに、2回のスプリットダメージを与える問題ととらえることが出来ないからです。
自身のライフ2のカードが途中でダメージを喰らい、ライフが1減っている状況が生まれるからです。
計算は分岐します。
自身がダメージを喰らって3回目まで生き延びている状態と
一度もダメージを喰らわずに3回目まで生き延びている状態です。
この分岐の割合というものを先に計算します。

ライフが1, 2, 3 というカードがそれぞれ一枚ずつある中

1/3 の確率で 1 がダメージを受けて撃破され、場には
2 と 3 のライフの2枚のカードが残ります。

同様に 1/3 の確率で 2 がダメージを受けて持ちこたえ、場には
ライフ 1, 1, 3 というカードが3枚残ります。

同様に 1/3 の確率で 3 がダメージを受けて持ちこたえ、場には
ライフ 1, 2, 2 というカードが3枚残ります。

さて、1がダメージを受けて場に2枚だけ残っている状態について考えます。
そこから 1/2 の確率で 2 のカードがダメージを受けて持ちこたえ、場には
ライフ 1, 3 のカード2枚が残ります。

同様に 1/2 の確率で 3 のカードがダメージを受けて持ちこたえ、場には
ライフ 2, 2 のカード2枚が残ります。

今度は 2 がダメージを受けて持ちこたえた状態について考えます。
場には3枚残っていますので、一枚目の 1 がダメージを受けた場合について
これが起こる確率は 1/3 であり、場には
ライフ 1, 3 の2枚があります。

同様にして 1/3 の確率で、2枚目の 1 がダメージを受けた場合について
ライフ 1, 3 の2枚が残ります。

同様にして 1/3 の確率で、3 がダメージを受けた場合について
ライフ 1, 1, 2 の3枚が残ります。

最後に 3 がダメージを受けて持ちこたえた状態について考えます。
場には3枚残っていますので、一枚目の1がダメージを受けた場合について
これが起こる確率は 1/3 であり、場には
ライフ 2, 2 の2枚が残ります。

同様に、1/3 の確率で、二枚目の2がダメージをうけた場合は
ライフ 1, 1, 2 の 3枚が残ります。

同様に 1/3 の確率で、三枚目の2がダメージをうけた場合は
ライフ 1, 2, 1 の 3枚が残ります。

ここまで並べてみて、気づいたことに
これらの結果を集計することでも、ダメージ回数2の時のそれぞれのカードの撃破率を正確に計算することができると思います。
1枚目のライフ1のカードが撃破された組み合わせを見てみると
最初の攻撃で 1/3 で撃破されたケースと
1/3 で 2が攻撃をうけて生き残り、その後 1/3 で撃破されてしまうケースと
1/3 で 3が攻撃を受けて生き残り、その後 1/3 で撃破されてしまうケースがあることがわかりました。
それぞれの撃破率を足すと
1/3 + 1/3 * 1/3 + 1/3 * 1/3 = 5/9 = 0.5555556
予想通り、一致しましたね。

現在の分岐は 8 パターンありますが、この状態からさらに3回目のダメージの分岐を書いてみます。
考え方は合っていたので、まず8パターンを簡易表記します。
場の状態 その状態の確率 パターン名
0, 2, 2 1/3 * 1/2 A
0, 1, 3 1/3 * 1/2 B
0, 1, 3 1/3 * 1/3 C
1, 0, 3 1/3 * 1/3 D
1, 1, 2 1/3 * 1/3 E
0, 2, 2 1/3 * 1/3 F
1, 1, 2 1/3 * 1/3 G
1, 2, 1 1/3 * 1/3 H

D のときのみ 1/3 * 1/3 の確率でダメージ二回目で撃破されていることがわかります。
値にして 0.11111111 プログラムの計算結果ともほぼ一致しています。
では3回目のダメージが終わった状態を列挙してみます。

まず A について
0, 1, 2 1/3 * 1/2 * 1/2 A1
0, 2, 1 1/3 * 1/2 * 1/2 A2

こんな感じで、どんどん書きます。
0, 0, 3 1/3 * 1/2 * 1/2 B1
0, 1, 2 1/3 * 1/2 * 1/2 B2

0, 0, 3 1/3 * 1/3 * 1/2 C1
0, 1, 2 1/3 * 1/3 * 1/2 C2

0, 0, 3 1/3 * 1/3 * 1/2 D1
1, 0, 2 1/3 * 1/3 * 1/2 D2

0, 1, 2 1/3 * 1/3 * 1/3 E1
1, 0, 2 1/3 * 1/3 * 1/3 E2
1, 1, 1 1/3 * 1/3 * 1/3 E3

0, 1, 2 1/3 * 1/3 * 1/2 F1
0, 2, 1 1/3 * 1/3 * 1/2 F2

0, 1, 2 1/3 * 1/3 * 1/3 G1
1, 0, 2 1/3 * 1/3 * 1/3 G2
1, 1, 1 1/3 * 1/3 * 1/3 G3

0, 2, 1 1/3 * 1/3 * 1/3 H1
1, 1, 1 1/3 * 1/3 * 1/3 H2
1, 2, 0 1/3 * 1/3 * 1/3 H3

書き終えました。
場の二枚目の列が0となった組み合わせをピックアップして列挙します。
0, 0, 3 1/3 * 1/2 * 1/2 B1
0, 0, 3 1/3 * 1/3 * 1/2 C1
0, 0, 3 1/3 * 1/3 * 1/2 D1
1, 0, 2 1/3 * 1/3 * 1/2 D2
1, 0, 2 1/3 * 1/3 * 1/3 E2
1, 0, 2 1/3 * 1/3 * 1/3 G2
確率の合計を出してみましょう。
1/3 * 1/2 * 1/2 + 1/3 * 1/3 * 1/2 + 1/3 * 1/3 * 1/2 + 1/3 * 1/3 * 1/2 + 1/3 * 1/3 * 1/3 + 1/3 * 1/3 * 1/3 =
1/12 + 1/18 + 1/18 + 1/18 + 1/27 + 1/27 =
1/4 + 2/27 = 35 / 108 = 0.3240740740740741

なるほど、書くべきプログラムが見えてきました。
次の記事へ続きます。

simplestar-tech.hatenablog.com