無機野

ここはお前の日記帳

マリガンした時に目的のカードが第nターンまでに手にある確率

例えば3積みしたカードをnターン目までに引く確率は何%か、みたいなちょっと混んだ確率を計算するとき、厳密に確率計算するよりとりあえずコード書いてシミュレーションしてみたほうがよっぽど都合の良い場合がある
というわけで3積みしたエイラや御旗や超越やらをマリガンした場合に引いてくる確率を計算してみた

import random as rd
import matplotlib.pyplot as plt
import collections as col

target = 3 #セラフ
others = 40 - target
m = 3 #マリガン枚数
time = 1000000 #試行回数

def mulligan():
    x = [] #ターゲットが来たターンから成るリスト。0は初手orマリガンで来た場合、それ以外は来たターン。後攻は-1ターンして考える
    for j in range(time):
        deck = []
        hand = []
        for i in range(target):
            deck.append("t")
        for i in range(others):
            deck.append("o")
        rd.shuffle(deck) #デッキ作成&まぜまぜ完了
        for i in range(3):
            hand.append(deck.pop()) #マリガン前初手引き
        if "t" in hand:
            x.append(0) #マリガン前に来たら終了
            continue
        else: #マリガンしても来なかったら
            for i in range(m):
                deck.append(hand.pop())
            rd.shuffle(deck)
            for i in range(m):
                hand.append(deck.pop())
            if "t" in hand:
                x.append(0)
                continue #マリガンして来たら終了
            rd.shuffle(deck)
            for k in range(37): #マリガンしてもターゲットが無い場合
                aaa = deck.pop()
                if aaa == "t":
                    x.append(k+1)
                    break
        
#    print("deck",deck,len(deck))
#    print("hand",hand,len(hand))
#    print("x",x,len(x))
    plt.hist(x,bins=max(x))
    aaa = col.Counter(x)

    ppp = 0
    for i in range(21):
        p = (aaa[i]/time)*100
        ppp += p
        print(i,"ターン目にターゲットを引いている確率",ppp,"%")

mulligan()
print(time,"回試行")
print("マリガン",m,"枚")

これをマリガンの枚数別に回してみる
上からノーチェンジ、1枚2枚フルマリガン
後攻は1T目2枚引きなので-1ターン考慮すること

0 ターン目にターゲットを引いている確率 21.3183 %
1 ターン目にターゲットを引いている確率 27.6999 %
2 ターン目にターゲットを引いている確率 33.7504 %
3 ターン目にターゲットを引いている確率 39.4381 %
4 ターン目にターゲットを引いている確率 44.790099999999995 %
5 ターン目にターゲットを引いている確率 49.821099999999994 %
6 ターン目にターゲットを引いている確率 54.517999999999994 %
7 ターン目にターゲットを引いている確率 58.94689999999999 %
8 ターン目にターゲットを引いている確率 63.048199999999994 %
9 ターン目にターゲットを引いている確率 66.8643 %
10 ターン目にターゲットを引いている確率 70.4036 %
11 ターン目にターゲットを引いている確率 73.6943 %
12 ターン目にターゲットを引いている確率 76.7449 %
13 ターン目にターゲットを引いている確率 79.52720000000001 %
14 ターン目にターゲットを引いている確率 82.09120000000001 %
15 ターン目にターゲットを引いている確率 84.42180000000002 %
16 ターン目にターゲットを引いている確率 86.53670000000002 %
17 ターン目にターゲットを引いている確率 88.44090000000003 %
18 ターン目にターゲットを引いている確率 90.16450000000003 %
19 ターン目にターゲットを引いている確率 91.72060000000003 %
20 ターン目にターゲットを引いている確率 93.09680000000003 %
1000000 回試行
マリガン 0 枚
f:id:moppii:20161206002331p:plain

0 ターン目にターゲットを引いている確率 27.693099999999998 %
1 ターン目にターゲットを引いている確率 33.5411 %
2 ターン目にターゲットを引いている確率 39.0525 %
3 ターン目にターゲットを引いている確率 44.2825 %
4 ターン目にターゲットを引いている確率 49.2106 %
5 ターン目にターゲットを引いている確率 53.8245 %
6 ターン目にターゲットを引いている確率 58.1519 %
7 ターン目にターゲットを引いている確率 62.201499999999996 %
8 ターン目にターゲットを引いている確率 66.0148 %
9 ターン目にターゲットを引いている確率 69.50269999999999 %
10 ターン目にターゲットを引いている確率 72.7652 %
11 ターン目にターゲットを引いている確率 75.8128 %
12 ターン目にターゲットを引いている確率 78.5983 %
13 ターン目にターゲットを引いている確率 81.172 %
14 ターン目にターゲットを引いている確率 83.5312 %
15 ターン目にターゲットを引いている確率 85.6756 %
16 ターン目にターゲットを引いている確率 87.6478 %
17 ターン目にターゲットを引いている確率 89.43690000000001 %
18 ターン目にターゲットを引いている確率 91.03460000000001 %
19 ターン目にターゲットを引いている確率 92.46020000000001 %
20 ターン目にターゲットを引いている確率 93.72140000000002 %
1000000 回試行
マリガン 1 枚
f:id:moppii:20161206002357p:plain

0 ターン目にターゲットを引いている確率 33.1351 %
1 ターン目にターゲットを引いている確率 38.5676 %
2 ターン目にターゲットを引いている確率 43.6727 %
3 ターン目にターゲットを引いている確率 48.5297 %
4 ターン目にターゲットを引いている確率 53.0668 %
5 ターン目にターゲットを引いている確率 57.3196 %
6 ターン目にターゲットを引いている確率 61.3138 %
7 ターン目にターゲットを引いている確率 65.0617 %
8 ターン目にターゲットを引いている確率 68.5632 %
9 ターン目にターゲットを引いている確率 71.7999 %
10 ターン目にターゲットを引いている確率 74.81559999999999 %
11 ターン目にターゲットを引いている確率 77.64699999999999 %
12 ターン目にターゲットを引いている確率 80.22789999999999 %
13 ターン目にターゲットを引いている確率 82.58359999999999 %
14 ターン目にターゲットを引いている確率 84.7405 %
15 ターン目にターゲットを引いている確率 86.73729999999999 %
16 ターン目にターゲットを引いている確率 88.56429999999999 %
17 ターン目にターゲットを引いている確率 90.20169999999999 %
18 ターン目にターゲットを引いている確率 91.68749999999999 %
19 ターン目にターゲットを引いている確率 92.97989999999999 %
20 ターン目にターゲットを引いている確率 94.14999999999999 %
1000000 回試行
マリガン 2 枚
f:id:moppii:20161206002504p:plain

0 ターン目にターゲットを引いている確率 38.209900000000005 %
1 ターン目にターゲットを引いている確率 43.217400000000005 %
2 ターン目にターゲットを引いている確率 47.984700000000004 %
3 ターン目にターゲットを引いている確率 52.41760000000001 %
4 ターン目にターゲットを引いている確率 56.569300000000005 %
5 ターン目にターゲットを引いている確率 60.4986 %
6 ターン目にターゲットを引いている確率 64.1774 %
7 ターン目にターゲットを引いている確率 67.63210000000001 %
8 ターン目にターゲットを引いている確率 70.89260000000002 %
9 ターン目にターゲットを引いている確率 73.89020000000002 %
10 ターン目にターゲットを引いている確率 76.67410000000002 %
11 ターン目にターゲットを引いている確率 79.24760000000002 %
12 ターン目にターゲットを引いている確率 81.62980000000002 %
13 ターン目にターゲットを引いている確率 83.83390000000001 %
14 ターン目にターゲットを引いている確率 85.85800000000002 %
15 ターン目にターゲットを引いている確率 87.72270000000002 %
16 ターン目にターゲットを引いている確率 89.40250000000002 %
17 ターン目にターゲットを引いている確率 90.90200000000002 %
18 ターン目にターゲットを引いている確率 92.26930000000002 %
19 ターン目にターゲットを引いている確率 93.48920000000001 %
20 ターン目にターゲットを引いている確率 94.5588 %
1000000 回試行
マリガン 3 枚
f:id:moppii:20161206002536p:plain

というわけでフルマリガンすると1T目には4割方手に入っているという結果に
正直想像以上に高いというか、実際フルマリガンすることも稀なのでこれで妥当という感じはする