ハートオブクラウン 3 or 4ターン目擁立の確率

ハートオブクラウン 3 or 4ターン目擁立の確率

ハートオブクラウン 4ターン目までに擁立できる確率を計算

「Heart of Crown~ハートオブクラウン~」における早期擁立について、 前回は購入カードごとの3ターン目擁立の確率計算を行った。

今回は拡張して、デッキ1周(弱)分の4ターン目までに擁立できる確率を求めた。

1. 結果

※2020/08/31 いろいろ追加

購入カードの組み合わせ3ターン擁立確率3or4ターン擁立確率
焼き畑農業 + 金貸し47.73%82.83%
焼き畑農業 + 焼き畑農業39.77%66.92%
焼き畑農業 + 願いの泉 + ケットシー39.66%-
金貸し + 名馬37.25%-
焼き畑農業 + 名馬37.25%-
金貸し + (都市 or 2コイン0連結カード)37.12%72.98%
金貸し + 願いの泉35.73%-
焼き畑農業 + 願いの泉35.73%-
焼き畑農業 + (都市 or 2コイン0連結カード)34.47%67.68%
金貸し + お金好きの妖精30.05%67.30%
金貸し + 1コイン1連結カード30.05%60.10%
焼き畑農業 + お金好きの妖精22.10%46.09%
焼き畑農業 + 1コイン1連結カード22.10%44.19%
都市 + (都市 or 2コイン0連結カード)21.21%42.42%
名馬 + (都市 or 2コイン0連結カード)12.63%-
1コイン1連結カード × 2 + (都市 or 2コイン0連結カード)9.79%19.58%
都市 + お金好きの妖精8.84%29.04%
1コイン1連結カード + (都市 or 2コイン0連結カード)8.84%17.68%

この表にあるものしか計算してない。

※2コイン0連結カード=(交易船、歩兵大隊、サムライ、宮廷闘争、ドワーフの宝石職人、近衛騎士団、地方役人)
※1コイン1連結カード=(城壁、隠れ家、洗礼)

焼き畑農業を2枚買うと事故ることが分かる。

計算の詳細は後述。

2. 計算

前回はGoogleスプレッドシートによる半手計算を行って時間を無駄にした。
今回はpythonでプログラムを組んで計算してもらった。

2.1 3ターン目擁立の確率計算プログラム

まずは簡単なパターンからやる。
itertools.combinationsを使うと与えたListからn個抜き出す組み合わせを全通り出してくれることが分かったのでそれを使う。

↓のような関数を作った。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import itertools

# 3ターン目擁立の確率を計算
def youritsu_3(deck):
youritsu = 0 # 擁立成功回数
pattern = 0 # 組み合わせの数

# deck から 5枚 を引いた組み合わせを総当たりループ
for hand in itertools.combinations(deck, 5):
pattern = pattern + 1
print(hand, end=" ")

# 手札のコイン計算
if ("y" in hand): coin = hand.count(1)*2 + hand.count(2)*2 + hand.count("k")*3 # y = 焼き畑農業 がある場合
else: coin = hand.count(1)*1 + hand.count(2)*2 + hand.count("k")*3 # それ以外の場合

# 手札のコインが6以上なら擁立成功
if(coin >= 6):
youritsu = youritsu + 1
print("youritsu !", end=" ")
print("")

print(f"youritsu: {youritsu} / pattern: {pattern} = {youritsu / pattern}")

デッキのリストを用意して関数に渡す。

1
2
deck = [0,0,0,1,1,1,1,1,1,1,2,"y"]
youritsu_3(deck)

一部を抜粋すると↓のように出力される。

1
2
3
4
5
6
7
8
9
10
11
12
(0, 1, 1, 1, 2)
(0, 1, 1, 1, 'y') youritsu !
(0, 1, 1, 1, 1)
(0, 1, 1, 1, 2)
(0, 1, 1, 1, 'y') youritsu !
(0, 1, 1, 1, 2)
(0, 1, 1, 1, 'y') youritsu !
(0, 1, 1, 2, 'y') youritsu !
(0, 1, 1, 1, 1)
(0, 1, 1, 1, 1)
(0, 1, 1, 1, 2)
(0, 1, 1, 1, 'y') youritsu !

最終結果が↓のように出力される。

1
youritsu: 273 / pattern: 792 = 0.3446969696969697

これで3ターン目擁立の確率を計算したところ、前回行った半手計算の結果と一致していた。
優秀。

※手札交換パターンは対応できないので計算していない

2.2 プログラムの一般化

先のプログラムは擁立に必要な6コインの計算しかできず不便なため、必要なコインの最小、最大を任意に与えられるようにした。
また、コインが条件を満たさなかった場合に次以降のターンの手札で計算を行えるようにした。

これにより、3 or 4ターン目の擁立確率が計算できる。

↓こうなった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import itertools
import copy

# 手札のコインを計算
def hand_coin_calc(hand):
if ("y" in hand): coin = hand.count(1)*2 + hand.count(2)*2 + hand.count("k")*3 # y = 焼き畑農業 がある場合
else: coin = hand.count(1)*1 + hand.count(2)*2 + hand.count("k")*3 # それ以外の場合
return coin


# デッキから5枚引いた時の任意のコイン確率を計算
def deck_coin_calc(deck, min_coin=6, max_coin=100, turn=1):
success = 0 # 成功回数
pattern = 0 # 組み合わせの数

# deck から 5枚 を引いた組み合わせを総当たりループ
for hand in itertools.combinations(deck, 5):
pattern = pattern + 1
print(hand, end=" ")
coin = hand_coin_calc(hand) # 手札のコイン計算
if(coin >= min_coin and coin <= max_coin): # 手札のコインがmin_coin以上、max_coin以下なら成功
success = success + 1
print("success !", end=" ")

elif(turn > 1): # コインが条件を満たさなければ次のターンへ
new_deck = copy.copy(deck)
for h in hand: new_deck.remove(h) # 今の手札をデッキから削除
# 新デッキでの成功確率を計算 プラスする
success = success + deck_coin_calc(new_deck, min_coin, max_coin, turn-1)

print("")

print(f"success: {success} / pattern: {pattern} = {success / pattern}")
return success / pattern # 確率を返す

同様にデッキのリストを用意して関数に渡す。

1
2
deck = [0,0,0,1,1,1,1,1,1,1,2,"y"]
deck_coin_calc(deck, turn= 2)

最終結果が↓のように出力される。

1
success: 536.0000000000018 / pattern: 792 = 0.676767676767679

それっぽい数値が出たので多分あってることとする。
保証はしない。

参考

itertools — 効率的なループ実行のためのイテレータ生成関数

3. ハトクラリンク

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×