【ポケポケ】初手たねポケ1枚確定ってどういうロジック？

## 背景
**ポケモンカードゲーム**（以下ポケカ）では「**たねポケモン**（以下たねポケ）」を場に出せないと始まらないので、ルール上、最初の手札には必ずたねポケが入るようになっている。
紙のポケカでは最初に7枚のカードを引いて手札とし、ここでたねポケを1枚も引けなかった場合は、手札を山札に戻して再度引き直す。ただし、引き直す度に「相手は追加でカードを1枚引いてもよい」というペナルティ的な措置がある。
アプリ版ポケカのPokémon Trading Card Game Pocket（以下ポケポケ）では最初に5枚のカードが自動的に引かれて手札となるが、ここで**システム的な処理**がなされて、たねポケが最低1枚必ず手札に入るようになっているようだ。

では、この「**システム的な処理**」とはどんな処理か？ということでタイトルに戻って「初手たねポケ1枚確定ってどういうロジック？」を本記事では考える。

## 仮説

ロジックとしてとりあえず以下の3つが思いつく。ちなみに筆者はゲーム開発経験無しなので経験に基づくロジックではないことを許してほしい。

1. 初めにたねポケの中から1枚引き、残り4枚をたねポケ含めた全ての山札から引く
1. 山札から5枚引き、その中にたねポケが含まれなかった場合、再度山札から5枚引き直す
1. 山札から5枚引き、その中にたねポケが含まれなかった場合、うち1枚をたねポケ1枚と入れ替える

この3つのロジックはどれも「初手で引く5枚に必ず1枚たねポケが入る」という結果は同じであるが、<b>「初手で引く5枚に2枚以上のたねポケが入る確率」</b>が変わってくる。実際どれぐらい変わるのかということを以下でそれぞれ計算した。

#### 前提条件
ポケポケのデッキは全部で20枚のカードから構成される。20枚のうち2枚をたねポケとした時、初手で引く5枚にたねポケが2枚入る確率を計算する。

#### ロジック１
**<INS>初めにたねポケの中から1枚引き、残り4枚をたねポケ含めた全ての山札から引く**
この場合は、「デッキ20枚からたねポケ1枚を除き、残った19枚から4枚を引いた時にもう1枚のたねポケを引く確率」で考えることができる。
カード4枚全体の組み合わせは3876通り、カード4枚中たねポケ1枚の組み合わせは816通りとなるので、816 ÷ 3876でおよそ **21.1%** になる。

```Python.py
import math
comb_a = math.comb(18, 3) # カード4枚中たねポケ1枚の組み合わせ
comb_b = math.comb(19, 4) # カード4枚全体の組み合わせ
prob = comb_a / comb_b 
print(prob)

# 0.21052631578947367
```

#### ロジック２
**<INS>山札から5枚引き、その中にたねポケが含まれなかった場合、再度山札から5枚引き直す**
この場合、「デッキ20枚から5枚引いて、たねポケを1枚以上引いた場合に、たねポケを2枚とも引いている確率」で考えることができる。
カード5枚中たねポケ1枚のみの組み合わせは6120通り、カード5枚中たねポケ2枚の組み合わせは816通り、たねポケ1枚以上の組み合わせはこれらを足して6936通りとなるので、816 ÷ 6936でおよそ **11.8％** になる。

```Python.py
import math
comb_a = math.comb(18, 3)                   # カード5枚中たねポケ2枚の組み合わせ
comb_b = math.comb(18, 4) * math.comb(2, 1) # カード5枚中たねポケ1枚のみの組み合わせ
prob = comb_a / (comb_a + comb_b)
print(prob)

# 0.11764705882352941
```


#### ロジック３
**<INS>山札から5枚引き、その中にたねポケが含まれなかった場合、うち1枚をたねポケ1枚と入れ替える**
この場合は「デッキ20枚から5枚引いて、たねポケを2枚とも引いている確率」で考えることができる。
カード5枚全体の組み合わせは15504通りで、カード5枚中たねポケ2枚の組み合わせは816通りとなるので、816 ÷ 15504でおよそ **5.2％** になる。

```Python.py
import math
comb_a = math.comb(18, 3) # カード5枚中たねポケ2枚の組み合わせ
comb_b = math.comb(20, 5) # カード5枚全体の組み合わせ
prob = comb_a / comb_b
print(prob)

# 0.05263157894736842
```

#### 仮説まとめ
ロジック１では**21.1%**、ロジック２では**11.8％**、ロジック３では**5.2％** と、それなりに確率が変わってくることがわかる。なので、実際に実機でどれぐらいの確率で引くのかを確認してみれば、どんなロジックなのかをある程度推測できる。


### 検証

たねポケ（コイキング）2枚とたねポケ以外（きずぐすり、モンボ、レドカ、図鑑、スピーダー、スコープ、博士、笛、石板）各2枚の計20枚のデッキを作成し、「ひとりで」モードでNPC対戦を120回行い、初手に引いた5枚とついでにコイントスの結果を記録した。結果を以下に記載していく。

| カード | 引いた回数 | 確率（引いた回数÷120回） |
|:-:|:-:|:-:|
|コイキング（1枚引き） | 110 | 92% |
|コイキング（2枚引き） | 10  | 8%  |

コイキング（たねポケ）を2枚同時に引いた回数は10回で、確率としては10 ÷ 120で **8%** となった。試行回数が不足していることもありロジック2とロジック3の間ぐらいの結果になったが、少なくともロジック1ではなさそうということがわかる。

ついでにそれ以外のカードを引いた枚数は以下の通りである。確率はトータルの引いた枚数（120回 × 5枚）を分母としている。

| カード | 引いた回数 | 確率（引いた回数÷600枚） |
|:-:|:-:|:-:|
|コイキング | 130 | 22% |
|きずぐすり  | 55  | 9%  |
|モンボ | 72  | 12%  |
|レドカ  | 53  | 9%  |
|図鑑   |41   |7%   |
|スピーダー   |53   |9%   |
|スコープ   |50   |8%   |
|博士   |56   |9%   |
|笛   |53   |9%   |
|石板   |37   |6%   |

さらについでにコイントスの結果は以下のようにおおよそ50%に無事落ち着いた。

| コイントス | 引いた回数 | 確率 |
|:-:|:-:|:-:|
| 表  | 57  | 48% |
| 裏  | 63  | 52% |

<details><summary>全データ（折り畳み）</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/f9f42cb9-cbc3-5833-4e01-a549f83039cd.png)

</details>

### おわりに
「初手たねポケ1枚確定」の仕様に採用されているロジックによって、「初手に2枚以上たねポケを引く確率」は変わってくる。実際どのようなロジックが使われているのかはわからないが、今回の検証では「初めにたねポケの中から1枚引き、残り4枚をたねポケ含めた全ての山札から引く」というロジックでは無さそうという結果になった。初手率計算を行う方々への参考になれば幸いである。

### 検証した環境
Pokemon Card Android版 バージョン1.0.9


## 追記
機械的な手法により試行回数を十分に確保し、各ロジック間の有意差を検証した記事を書いていただきました。こちらも合わせてご参照ください。

https://qiita.com/machapin/items/a4d3b09d1b369c123e85#_reference-fab55da3b300b8a4442c