ポケポケのガチャ確率シミュレーター作った
ポケポケ無課金勢だが、全然exポケモン集まらないのでどのくらい低確率なのか調べるために作った。
サイト
技術スタック
技術選定だが、元々ガチャシュミレーターを開発していたのでポケポケの確率に合わせて別のページを作った。初版は4年前だがなんと3回も作り直している。
- 初代: https://github.com/thr3a/gacha-simulator
- Nuxt(Vue.js), Bootstrap
- 2代目: https://github.com/thr3a/gacha-simulator2
- Next.js, Mantine, ESLint
- 3代目: https://github.com/thr3a/gacha-simulator3
- Vite, Mantine, Biome
元々NextjsだったがペラページにはToo muchだと思いこれを機にViteに移行した。Mantineの作者がテンプレートも出してくれているので移行しやすかった。 Mantineはいいぞ。 BiomeはESLintのパッケージとルールがカオスになりつつあったので乗り換えた。
確率の求め方
確率はアプリ内に記載されているが、一覧はGameWithのサイトが見やすい。実は1〜3枚目と4枚目5枚目で確率テーブルが異なる。そこでTypeScriptの型宣言でテーブルを作成する。例えばd4(◇◇◇◇)が4枚目に出る確率は1.666%となる。また、特定のカードを当てる確率も今回求めたかったので同様にテーブルを作成した。ゴッドパックなるものが存在するらしいが2000パックに1つレベルなので無視している。
// レアリティごとの確率テーブル
private readonly probabilityTable = {
d1: { first3: 100, fourth: 0, fifth: 0 },
d2: { first3: 0, fourth: 90, fifth: 60 },
d3: { first3: 0, fourth: 5, fifth: 20 },
d4: { first3: 0, fourth: 1.666, fifth: 6.664 },
s1: { first3: 0, fourth: 2.572, fifth: 10.288 },
s2: { first3: 0, fourth: 0.5, fifth: 2 },
s3: { first3: 0, fourth: 0.222, fifth: 0.888 },
k1: { first3: 0, fourth: 0.04, fifth: 0.16 }
};
// 特定カードの確率テーブル
private readonly specificProbabilityTable = {
d1: { first3: 2, fourth: 0, fifth: 0 },
d2: { first3: 0, fourth: 2.571, fifth: 1.714 },
d3: { first3: 0, fourth: 0.357, fifth: 1.428 },
d4: { first3: 0, fourth: 0.333, fifth: 1.332 },
s1: { first3: 0, fourth: 0.321, fifth: 1.286 },
s2: { first3: 0, fourth: 0.055, fifth: 0.222 },
s3: { first3: 0, fourth: 0.222, fifth: 0.888 },
k1: { first3: 0, fourth: 0.013, fifth: 0.053 }
};
あとは
- 1回以上カードが出る確率
- カードが1枚も出ない確率
- ちょうどX枚出る確率
- X回以上出る確率
- X%の確率で出るのに必要なパック数
を計算する関数を実装する。
// 1回以上カードが出る確率
getAtLeastOneProbability(isSpecific = false): number {
const packProb = this.getPackProbability(isSpecific);
return Math.round((1 - (1 - packProb) ** this.packs) * 1000) / 1000;
}
// カードが1枚も出ない確率
getZeroProbability(isSpecific = false): number {
const packProb = this.getPackProbability(isSpecific);
return Math.round((1 - packProb) ** this.packs * 1000) / 1000;
}
...
組み合わせの計算は実装面倒だったのでmath.jsのライブラリに頼った。あとロジックの大半はClaude 3 Sonnetにお願いした。GPT4-oよりコード実装力があると思っている。
パック開封ポイントは何に使うのがアドなのか
結論: ◇3カードの交換が1番確率的にアド
ポケポケでは1パック開封すると5ポイント貯まり、レアリティに応じてポイントを払うことで好きなカードを一発入手できる。
レアリティ | 消費量 |
---|---|
◇ | 35 |
◇◇ | 70 |
◇◇◇ | 150 |
◇◇◇◇ | 500 |
☆ | 400 |
☆☆ | 1250 |
☆☆☆ | 1500 |
👑 | 2500 |
対戦で強いのはexポケモンだが◇4なので500ポイントも消費してしまう。かといってレアリティの少ないカードに消費しても次のガチャで素引きしてダブってしまう可能性もある。悩ましい。。。。
そんなときに確率計算が役に立つ。例えば◇3と◇4をそれぞれ5パック開けたときの特定のカードを引き当てる確率を計算してみる。
◇3の場合
◇4の場合
実は◇3と◇4では確率に大きな差はない。これは◇3の種類が◇4より多く、ピンポイントに引き当てるのが難しいからである。これなら500ポイント使って◇4を1枚より300ポイントで◇3を2枚交換の方が強いデッキが作れそうである。
最後に
確率が間違ってたらすみません。
Discussion