サイド落ち計算機
python3 で動きます。
deck には メノコマシラロンゲ 2026 S1のリストを入れている
code:python
from math import comb
deck = {
"Marnie's Impidimp": 3,
"Marnie's Morgrem": 2,
"Marnie's Grimmsnarl ex": 2,
'Munkidori': 4,
'Snorunt': 2,
'Froslass': 2,
'Bloodmoon Ursaluna ex': 1,
'Iron Bundle': 1,
'Maractus': 1,
'Shaymin': 1,
'Secret Box': 1,
'Buddy-Buddy Poffin': 2,
'Nest Ball': 1,
'Ultra Ball': 1,
'Earthen Vessel': 1,
'Rare Candy': 1,
'Night Stretcher': 2,
'Super Rod': 1,
'Counter Catcher': 2,
"Boss's Orders": 2,
"Lillie's Conviction": 4,
"Arven": 4,
'Iono': 2,
"Professor's Research": 2,
'Spikemuth Gym': 2,
'Artazon': 1,
'Technical Machine: Evolution': 2,
'Technical Machine: Devolution': 1,
'Air Balloon': 1,
'D_ENERGY': 8
}
HAND = 7
SIDE = 6
N = sum(deck.values())
print(f"Deck size: {N}")
# たねポケ
seed_cards = [
"Marnie's Impidimp", "Munkidori", "Snorunt",
'Bloodmoon Ursaluna ex', 'Iron Bundle', 'Maractus', 'Shaymin'
]
HIT = sum(deckc for c in seed_cards)
# 初手に種ポケが1枚以上ある確率
P_E = 1 - comb(N - HIT, HAND) / comb(N, HAND)
print(f"P(E): {P_E}")
def marginal_distribution(card):
n_card = deckcard
dist = []
for k in range(min(n_card, SIDE) + 1):
total_prob = 0
for h in range(min(n_card, HAND) + 1):
if h + k > n_card:
continue
# 手札に h 枚引く枚数組み合わせ数
ways_hand_card = comb(n_card, h)
# 残り山札から残り手札を埋める組み合わせ数
remaining_hand = HAND - h
remaining_deck = N - n_card
ways_hand_other = comb(remaining_deck, remaining_hand)
# 初手に種ポケがゼロの場合の組み合わせ数
# ただし残りの手札位枚数が山札から種ポケモンと対象カード枚数-手札に引いた h 枚数を引いた枚数以下のときは 0 になる
# ただし対象カードが種ポケで h != 0 の場合は除外する
remaining_n_cards = n_card - h
miss = comb(N - HIT - remaining_n_cards, remaining_hand) if (remaining_hand <= N - HIT - remaining_n_cards) and not(card in seed_cards and h != 0) else 0
# サイドに k 枚落ちる組み合わせ数
ways_side = comb(n_card - h, k) * comb(remaining_deck - remaining_hand, SIDE - k)
total_prob += ways_hand_card * (ways_hand_other - miss) * ways_side
dist.append(total_prob)
total = sum(dist)
if total == 0:
return 1.0 if i == 0 else 0.0 for i in range(len(dist))
return p / total for p in dist
# 結果出力
for card in deck:
print(f"{card}: {marginal_distribution(card)}")
# Snorunt: 0.8116706446399299, 0.18017576156494108, 0.008153593795128988
# Night Stretcher: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
出力例
P(E) は手札に種ポケモンが1枚以上含まれている確率で、このサイド落ち計算は条件付き確率として実装したつもり
code:output
Deck size: 60
P(E): 0.8371559499762459
Marnie's Impidimp: 0.7284368184717449, 0.24804568756479592, 0.02296270436599383, 0.0005547895974654076
Marnie's Morgrem: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Marnie's Grimmsnarl ex: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Munkidori: 0.6521291368769474, 0.30273297472388316, 0.04298482784758348, 0.0021241627767394663, 2.889777484645115e-05
Snorunt: 0.8116706446399299, 0.18017576156494108, 0.008153593795128988
Froslass: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Bloodmoon Ursaluna ex: 0.9021249398099792, 0.09787506019002079
Iron Bundle: 0.9021249398099792, 0.09787506019002079
Maractus: 0.9021249398099792, 0.09787506019002079
Shaymin: 0.9021249398099792, 0.09787506019002079
Secret Box: 0.8988605881638941, 0.10113941183610581
Buddy-Buddy Poffin: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Nest Ball: 0.8988605881638941, 0.10113941183610581
Ultra Ball: 0.8988605881638941, 0.10113941183610581
Earthen Vessel: 0.8988605881638941, 0.10113941183610581
Rare Candy: 0.8988605881638941, 0.10113941183610581
Night Stretcher: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Super Rod: 0.8988605881638941, 0.10113941183610581
Counter Catcher: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Boss's Orders: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Lillie's Conviction: 0.6450171203431505, 0.3076988209837874, 0.044961331840218804, 0.0022905335703982876, 3.219326244497238e-05
Arven: 0.6450171203431505, 0.3076988209837874, 0.044961331840218804, 0.0022905335703982876, 3.219326244497238e-05
Iono: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Professor's Research: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Spikemuth Gym: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Artazon: 0.8988605881638941, 0.10113941183610581
Technical Machine: Evolution: 0.8063793045810498, 0.18495158586119526, 0.00866910955775491
Technical Machine: Devolution: 0.8988605881638941, 0.10113941183610581
Air Balloon: 0.8988605881638941, 0.10113941183610581
D_ENERGY: 0.4017868810886605, 0.4166015301045503, 0.1541011664431174, 0.025509610071241053, 0.0019386237573157652, 6.158919545427421e-05, 5.993396606923926e-07
シュッとパースして↓
table:Name
Name\枚数 0枚 1枚 2枚 3枚 4枚 5枚 6枚
Marnie's Impidimp 72.84% 24.80% 2.30% 0.06%
Marnie's Morgrem 80.64% 18.50% 0.87%
Marnie's Grimmsnarl ex 80.64% 18.50% 0.87%
Munkidori 65.21% 30.27% 4.30% 0.21% 0.00%
Snorunt 81.17% 18.02% 0.82%
Froslass 80.64% 18.50% 0.87%
Bloodmoon Ursaluna ex 90.21% 9.79%
Iron Bundle 90.21% 9.79%
Maractus 90.21% 9.79%
Shaymin 90.21% 9.79%
Secret Box 89.89% 10.11%
Buddy-Buddy Poffin 80.64% 18.50% 0.87%
Nest Ball 89.89% 10.11%
Ultra Ball 89.89% 10.11%
Earthen Vessel 89.89% 10.11%
Rare Candy 89.89% 10.11%
Night Stretcher 80.64% 18.50% 0.87%
Super Rod 89.89% 10.11%
Counter Catcher 80.64% 18.50% 0.87%
Boss's Orders 80.64% 18.50% 0.87%
Lillie's Conviction 64.50% 30.77% 4.50% 0.23% 0.00%
Arven 64.50% 30.77% 4.50% 0.23% 0.00%
Iono 80.64% 18.50% 0.87%
Professor's Research 80.64% 18.50% 0.87%
Spikemuth Gym 80.64% 18.50% 0.87%
Artazon 89.89% 10.11%
Technical Machine: Evolution 80.64% 18.50% 0.87%
Technical Machine: Devolution 89.89% 10.11%
Air Balloon 89.89% 10.11%
D_ENERGY 40.18% 41.66% 15.41% 2.55% 0.19% 0.01% 0.00%
ロジックのメモ
code:aa
デッキ N枚
│
├─ 手札 7枚を引く
│ ├─ 対象カード c が手札に 0枚 → h = 0
│ │ └─ 残り n_c 枚が山札に残る → サイドに 0~min(n_c,6) 枚落ちる可能性
│ │
│ ├─ 対象カード c が手札に 1枚 → h = 1
│ │ └─ 残り n_c-1 枚が山札に残る → サイドに 0~min(n_c-1,6) 枚落ちる可能性
│ │
│ └─ 対象カード c が手札に 2枚 → h = 2
│ └─ 残り n_c-2 枚が山札に残る → サイドに 0~min(n_c-2,6) 枚落ちる可能性
│
└─ サイド 6枚を置く
├─ 山札残り枚数から 6枚を組み合わせで選択
└─ 条件付き確率として、初手に種ポケが1枚以上ある場合のみカウント
$ \begin{pmatrix} \end{pmatrix}
種ポケモンを$ S枚含む$ N枚のデッキから、手札として$ H枚引く。
このとき手札には種ポケモンが1枚以上含まれている必要があるという条件があり、その確率 $ P(E)は
$ P(E)=1-\frac{\begin{pmatrix} N-S \\ H \end{pmatrix}}{\begin{pmatrix} N \\H \end{pmatrix}}
その後サイド $ P枚を置く。
手札に種ポケモンが1枚も含まれない組み合わせの数 $ mを
サイド落ち計算したい対象のカード c の枚数 $ n_c を考慮して計算する
$ h_cは手札に引いた c の枚数
$ m = \begin{pmatrix} N-S-(n_c-h_c) \\ H-h_c \end{pmatrix}ただし$ H-h_c \le N-S-(n_c-h_c)
また $ h_cが 0ではなく、c が種ポケモンの場合は 0 になる。
この条件でのすべての考えられる手札の組み合わせに種ポケモンが含まれるため
対象カードc はデッキに $ n_c 枚含まれていて、手札に $ h_c枚、サイドに $ k_c枚含まれるときの組み合わせを考える
このとき常に$ n_c >= h_c + k_c
手札に引く組み合わせ $ w_{c} = \begin{pmatrix} n_c \\ h_c \end{pmatrix}
手札の残りのカードの組み合わせ $ w_{a}=\begin{pmatrix} N-n_c \\ H-h_c \end{pmatrix} - m
種ポケモンを含まない組み合わせを除外しているので、$ P(E)を使って正規化しなくてもよくなる。
サイドに落ちる組み合わせ $ w_{s}=\begin{pmatrix} n_c-h_c \\ k_c \end{pmatrix} \cdot \begin{pmatrix} (N-n_c)-(H-h_c) \\ P-k_c \end{pmatrix}
手札を引いた残りの山札からサイドに P 枚置く組み合わせを考えている
これらを元に条件付き確率 P を計算する
分子は $ h_cごとに合計され、分母は $ k' ごとに合計されている。
$ P(Cがサイドにk_c枚|初手に引く種ポケモンの枚数 \ge 1) = \frac{\Sigma_{h_c=0}^{min(n_c, H)} w_c \cdot w_a \cdot w_s}{\Sigma_{k'=0}^{min(n_c,P)}\Sigma_{h_c=0}^{min(n_c, H)}w_c \cdot w_a \cdot w_s}\\=\frac{\Sigma_{h_c=0}^{min(n_c, H)} \begin{pmatrix} n_c \\ h_c \end{pmatrix} \cdot \begin{pmatrix} \begin{pmatrix} N-n_c \\ H-h_c \end{pmatrix} - m \end{pmatrix} \cdot \begin{pmatrix} n_c-h_c \\ k_c \end{pmatrix} \cdot \begin{pmatrix} (N-n_c)-(H-h_c) \\ P-k_c \end{pmatrix}}{\Sigma_{k'=0}^{min(n_c,P)}\Sigma_{h_c=0}^{min(n_c, H)}\begin{pmatrix} n_c \\ h_c \end{pmatrix} \cdot \begin{pmatrix} \begin{pmatrix} N-n_c \\ H-h_c \end{pmatrix} - m \end{pmatrix} \cdot \begin{pmatrix} n_c-h_c \\ k' \end{pmatrix} \cdot \begin{pmatrix} (N-n_c)-(H-h_c) \\ P-k' \end{pmatrix}}
これをすべてのカード種類 c ととりうる $ h_c, $ k_c についてループで計算して、対象カード c がちょうど $ k_c枚サイド落ちする確率を算出している