デッキ構築について③ ~確率の話の詳細~
「デッキ構築について②」の計算部分を解説しようと思ったんだけど、どうやらmarkdown記法じゃないと数式を出すのが面倒っぽかったので別エントリーにしました、の巻。
まず一つ目。 「デッキにa枚入れたカードをn枚目までに引く確率」について。
これは「2マナのカードを何枚入れたら2ターン目までに引く確率が高いか」というような場合に使う。
デッキ総数:30 デッキ中の引きたいカード枚数:a 実際に引いた枚数:n n枚引いた時に1枚以上引きたいカードを引いている確率:P
まずは、n枚引いた時に1枚も引きたいカードを引かない確率Qを考える。
Qは[n枚引いたときに全て外れのパターン数]/[n枚カード引く時の全パターン数]で表せるので、以下のような式になる。
PはQが起こらなかった場合の全てなので、1-Qする。
これをExcelの関数を使って表にしたわけだ。
=(1-(COMBIN(30-[a],[n])/COMBIN(30,[n])))*100
こんな感じで。
この計算は「少なくとも1枚引く確率」を求めるので、序盤から中盤にかけての安定性を担保するために使うことが多い。
例えばクエストローグには【影隠れ】【ガジェッツァンの渡し守】【若き酒造大師】と6枚の「手札に戻す」カードが入っているわけだが、その内1枚でも引く確率は6枚引いた時点で77.3%。つまり先手3ターン、後手2ターンで1枚は手札に入る。全マリガンなら先後問わずに1ターン目で手に入る。もし手札に1枚既に持っているなら、残りを全てマリガンしたとして後手1ターン、先手3ターン目に2枚目が手に入る。
これって超速いよね。早期クエスト達成の安定感が別格なのはこういう理由なんだと思う。
次はこれ。
デッキ総数:30 デッキ中のキーカード枚数:a 手札に入れたい枚数:s 実際に引いた枚数:n n枚引いた時にs枚以上引きたいカードを引いている確率:P
これは「リーサル用のコンボパーツを6枚入れてるんだけど、その内3枚がそろえば勝てる」みたいなデッキに使う。
3枚コンボパーツを引けるのがどのくらいのタイミングなのかを知ることで、それまでにどれくらい耐えればいいのかという視点でプランを立てることができる。
計算方法は以下。
n枚引いた時 [s枚, s+1枚, …, a枚]の各枚数について 成功するパターン数 / カードを引く全組み合わせ を計算し、全て足し合わせる。
まずs枚の場合を考える。
分母はn枚引いた時の全てのパターン数なので、デッキ総数からn枚選ぶ順列でok。
分子はn枚引いた時に「s枚ちょうどキーカードを引いた」パターンの数。 これは「当たりだけの順列パターン×外れだけの順列パターン×全体の中での当たりの位置パターン」で出せる。
それぞれ見ていくと、「当たりだけの順列パターン」はキーカード全体a枚の中から、当たり枚数(この場合はs枚)を引くパターン。
これが当たりをお望み通り引いた時の、当たり内のカードの順列。
次に「外れだけの順列パターン」は「デッキのキーカード以外から選ぶ順列」なので以下の通り。
最後に「全体の中での当たりの位置パターン」。
これは、引いた数の全体の並びの中でどこに当たりが位置しているかなので、n枚中s枚選ぶ組み合わせである。
これにより、分子は以下のように計算できる。
で、こうやって求められた「分子 / 分母」をs枚からa枚まで足し合わせると、ようやく「30枚中a枚入っているカードをn枚引いてs枚手に入れる確率」が求められる。 長い。
こういうのって、うまく伝えるの難しい。まあ参考程度によろしくお願いします。
[おまけ]
2番目のやつで実際に使ったExcelのマクロを貼っつけておきます。
補足としては、上の方に定義してある「keycardCount」「deck」「threshold」は、それぞれExcel上でキーカード枚数とデッキ枚数と閾値を設定しているセルからデータを取っています。あと、謎のループ内にある変数kも、セル番号を指定する用のものなのでいきなり3から始まってるけど、1と読み替えると読みやすくなるんじゃないかしら。
これもまあ慣れてないと何が何やらなんだけどさ。
Sub 計算() Dim keycardCount As Integer keycardCount = Range("C3") Dim deck As Integer deck = Range("C2") Dim threshold As Integer threshold = Range("C5") For k = 3 To keycardCount + 2 Cells(8, k) = k - 2 For j = 9 To 35 Dim res As Single res = 0 For i = k - 2 To keycardCount Dim a As Double Dim b As Double Dim c As Double Dim d As Double Dim e As Integer Dim f As Integer Dim r As Single e = deck - keycardCount If Cells(j, 2) < i Then Exit For f = Cells(j, 2) - i If e < f Then Exit For a = Application.WorksheetFunction.Permut(keycardCount, i) b = Application.WorksheetFunction.Permut(e, f) c = Application.WorksheetFunction.Permut(deck, Cells(j, 2)) d = Application.WorksheetFunction.Combin(Cells(j, 2), i) r = a * b * d / c res = res + r Next res = Application.WorksheetFunction.RoundDown((res * 100), 1) If res >= threshold Then Cells(j, k).Font.ColorIndex = 3 Else Cells(j, k).Font.ColorIndex = 1 End If If res = 0 Then Cells(j, k) = "-" Else Cells(j, k) = res End If Next Next End Sub