ドミニオンの引ききりデッキについて

ドミニオンでコインを買うと強いと覚えたのでコインを買いまくっていたら引ききりデッキにぼこぼこにされたので、村と鍛冶屋がある場合に、それぞれ何枚ずつ買うとどれくらいの確率で引ききれるのかをテストしてみた。

凡例

2 4 1710

これは村が2枚、鍛冶屋が4枚、残り10枚がコインや勝利点カードの時の引き切る確率が17.1%と読む。

出力を全部見てもいまいち面白くないので、村と鍛冶屋の枚数の合計が一定の時にどう配分するのが一番多いのかだけをピックアップ:

3 4 2030
4 4 3689
5 4 4852
6 4 5438
6 5 5997
7 5 6714
8 6 7455
9 6 7758
10 6 8045
11 6 8236
11 7 8445
12 7 8629

つまり、鍛冶屋は村の半分+1〜2枚くらいをめどに買うのがいちばん確率が高い。そして村を12枚買うなんて無茶をしても引き切る確率は86%でしかない。

貯蔵庫を混ぜると確率が上がるかなぁ??

以下ソースコード

from copy import copy
from random import shuffle

VILL = 1
SMITH = 2
OTHER = 0
NUM_TRIAL = 10000

def draw(hand, deck, num):
    hand += deck[:num]
    deck = deck[num:]
    return hand, deck

def test(num_vill, num_smith, num_other=10):
    initial_deck = [VILL] * num_vill + [SMITH] * num_smith + [OTHER] * num_other
    num_success = 0
    for _trial in range(NUM_TRIAL):
        deck = copy(initial_deck)
        shuffle(deck)
        hand, deck = draw([], deck, 5)
        action = 1
        while action and deck:
            if VILL in hand:
                hand.remove(VILL)
                hand, deck = draw(hand, deck, 1)
                action += 1
            elif SMITH in hand:
                hand.remove(SMITH)
                hand, deck = draw(hand, deck, 3)
                action -= 1
            else:
                break
        if not deck:
            num_success += 1

    return num_success
        
for num_both in range(20):
    for num_smith in range(4, num_both + 1):
        num_vill = num_both - num_smith
        print num_vill , num_smith, test(num_vill, num_smith)