全力攻撃できる確率の計算


ラガブーリンの起こすターンやグレムリンボス1tなど、エナジーをアタックに全て使いたい時がありますが、出来ないこともあります。
ふと気になったので、pythonに計算させます。
攻略の役にはほとんど立ちません
デッキのアタックのコストと数を最初に入力したらコンピュータがnum回(この例だとnum = 100000)5ドローしてその時のアタックに割けるコストの合計を計算させます。
以下の例はアイクラ初期デッキのものです。

import random, collections
"""
A1:1コストアタックの数
A2:2コストアタックの数
A3:3コストアタックの数
others:アタック以外の数
num:試行回数
"""
A1 = 5
A2 = 1
A3 = 0
others = 5
num = 100000

"""Deckに指定したカードを入れていく"""
Cards = [(1, A1), (2, A2), (3, A3), (0, others)]
Deck = []
for C in Cards:
    for t in range(C[1]):
        Deck.append(C[0])

"""用意したDeckからランダムに5枚引き、アタックカードのコストのsumを求め、ansに記録する"""
ans = collections.defaultdict(lambda:0)
#ans.default_factory = lambda:0
for i in range(num):
    ans[(sum(random.sample(Deck, 5)))] +=1

"""
Ansは、試行でアタックにそのコスト分つぎ込めた回数
Ans2は、そのコスト以上アタックにつぎ込める推定された確率。例えば、ans2[0] = 1, ans2[1] = 94.64なら、アタックに1コスト以上つぎ込める確率が94.64だろうということ"""
Ans = list(ans.items())
Ans = sorted(Ans, key=lambda x:x[0])

count = 0
Ans2 = []
for a in Ans:
    count += a[1]
    Ans2.append((a[0], round(100-((count-a[1])/num)*100, 2)))

print("コスト1のアタックは%d枚\nコスト2のアタックは%d枚\nコスト3のアタックは%d枚\nその他のカードは%d枚\n試行回数%d回"%(A1, A2, A3, others, num))
print(Ans)
print(Ans2)

〜


試行回数100000回の1行下の(0,223)とか(1,5514)は、アタックに0コスト割けたのが試行回数の中で223回だった、アタックに1コスト割けたのが試行回数の中で5514回だったということです。つまり、アタックを引けなかった回数、ストライク1枚しか引けなかった回数と読み取ることができます。
次の行の(0, 100.0)は、アタックに0コスト以上割ける確率、(1, 99.78)はアタックに1コスト以上割ける確率です。
以上のことから、初期デッキでは3コス以上アタックに割ける確率は71.57%だろうと分かります。微妙な確率ですね。
それでは、呪いがエセリアルで消えた場合、

othersを4にして計算させると8割くらいになります。ラガブーリンに全力攻撃できないのはそこそこ起こり得るみたいですね。
初期デッキからストライク1枚削除。

初期デッキからストライク2枚削除。

初期デッキと比べて3コスアタックに注ぎ込める確率が71.57%→65.8%→59.35%と減少しています。

初期デッキに1コスアタック追加。

初期デッキに1コスアタック2枚追加。

初期デッキに1コスアタック3枚追加。

1枚ごとに約5%ほど全力攻撃できる確率が増えます。3枚目になると伸びが鈍くなっているようですね。

初期デッキに2コスアタック追加。

この計算だと、1コスアタック3枚には劣りますが2枚よりも全力攻撃しやすくなるみたいです。ただし、この計算機は自分の所持エナジーを考慮していないため、3エナ状態で2コスアタック2枚同時に引いて2エナしか割けなくなる状況を考えていません。その場合4エナ割ける判定になります。動的計画法というアルゴリズムを使えばこの問題は解決できると思いますが、面倒くさいので2コスアタック2枚同時に引いたら片方を削除するというコードを追加して計算させると、

4コスト以上アタックに割ける確率は劇的に減少していますが無視していいでしょう。3コスト以上割ける確率はそこまで落ちないみたいです。2コスアタック2枚引いて、1コストアタックを1枚も引かないのは低確率だったみたいですね。

そこそこ面白かったです。以上です