Try   HackMD

ガチャで複数人が欲しい時の確率

ガチャで複数人が欲しい時に確率が気になったけど計算式がよくわからなくなった時に見るもの

事前準備

github上で見る場合、これをインストールしておいた方が良いかと思われます

https://github.com/AaronCQL/katex-github-chrome-extension

ガチャ\(x\)連で確率\(y\)で出るSSRを\(z\)つ欲しい!

みなさんガチャ引いてますか?いわゆるソシャゲと言われるグラブル、FGO、デレステ、ラフェス、プリコネ、Nier、ウマ娘のようなゲームではもちろん、コンシューマー系でもモンハン、ゴーストオブツシマ、Bloodborneなどなど、あらゆるゲームにおいて確率とはバトルする羽目になります。というか確率とバトルしなくていいゲームはマリオとカービィぐらいしかぱっと思いつきません。

そんな確率と常日頃からバトルしてる皆さんには常識だと思われますが、100連で1%を1回以上つかみとれる確率は60%ちょいです。

では2回以上引ける確率はどうでしょう。ここで、当然25%ぐらいやろって言える方にはこの記事は要らないので他の記事を見に行きましょう。

SSRを2回引ける確率は、全ての確率(=1)から、SSRを0回引く確率と1回引く確率を引けば出ます。

\[ \begin{aligned} P(SSRを2回以上引く) &= 1 - P(SSRを0回引く) - P(SSRを1回引く)\\ \end{aligned} \]

\(P(SSRを0回引く)\)というのは、99%を100回連続で引き当てる確率に相当します。なので、

\[ \begin{aligned} P(SSRを0回引く) &= 0.99^{100}\\ &\simeq 0.37 \end{aligned} \]

SSRを1回以上引く確率が60%ちょいというのは、SSRを0回引く確率を1から引いてでてきてるわけですね。

\[ \begin{aligned} P(SSRを1回以上引く) &= 1 - P(SSRを0回引く)\\ &\simeq 1 - 0.37\\ &= 0.63 \end{aligned} \]

\(P(SSRを1回引く)\)というのは、99%を99回引き当てる確率をと1%を1回引き当てる確率に相当します。1%を1回引くのは100回ガチャを引く中のどこか1回で良いので、\(_{100}C_1\)の場合も考えてあげる必要がありますね。なので、

\[ \begin{aligned} P(SSRを1回引く) &= _{100}C_1 * 0.01^1 * 0.99^{99}\\ &\simeq 0.37 \end{aligned} \]

よって、

\[ \begin{aligned} P(SSRを2回以上引く) &= 1 - P(SSRを0回引く) - P(SSRを1回引く)\\ &\simeq 1 - 0.37 -0.37\\ &= 0.26 \end{aligned} \]

となります。25%ぐらいですね。3回以上になれば今度はさらにSSRを2回引く確率を更に引けば値が出ます。

\[ \begin{aligned} P(SSRを3回以上引く) &= 1 - P(SSRを0回引く) - P(SSRを1回引く) - P(SSRを2回引く)\\ &= 1 - 0.99^{100} - _{100}C_1 * 0.01^1 * 0.99^{99} - _{100}C_2 * 0.01^2 * 0.99^{98}\\ &\simeq 1 - 0.37 - 0.37 - 0.18\\ &=0.06 \end{aligned} \]

ここまでくれば規則性見えましたね。きちんと立式化すると以下になります。

\[ \begin{aligned} P(x連で確率yで出るSSRをz回以上引く) = 1 - \sum_{i=0}^{z-1} {}_{x}C_{i} * y^i * (1-y)^{x-i} \end{aligned} \]

ガチャ\(x\)連で確率\(a_i\)%で出るSSRをそれぞれ1つ以上欲しい!

みなさん嫌いなものありますか?私の嫌いなものの一つに複数人ピックアップガチャや限定闇鍋ガチャというものがあります。「同時にピックアップをするな。hogeは欲しいけどfugaはそこまで欲しいわけじゃねえんだよ」ってなります。限定闇鍋ガチャなんか最悪ですね。「期間限定のhogeとfugaが欲しい。いや別に他のカードも欲しくないわけじゃないけれど、hogeとfugaが欲しいんだよな」ってなります。

後はリセマラしてるときにもなりますよね。「hogeとfugaは最低限ほしい」って。

hogeが1%、fugaが2%の確率で出るとして、また100連しましょうか。この時知りたい確率は次になります。

\[ \begin{aligned} P(hogeを1回以上引く \cap fugaを1回以上引く) \end{aligned} \]

真ん中の\(\cap\)は「かつ」という意味です。「hogeを1回以上引く、かつ、fugaを1回以上引く」確率を求めたいわけですね。なお、次に出てきますが、\(\cup\)は「または」の意味です。

「hogeを1回以上引く」の逆(正確に言うと否定であって逆ではないですが)は「hogeを1回以上引かない」、つまりは「hogeを0回引く」ということになります。つまり、

\[ \begin{aligned} P(\overline{hogeを1回以上引く}) &= P(hogeを1回以上引かない)\\ &= P(hogeを0回引く) \end{aligned} \]

これでピースは揃いましたかね。

\[ \begin{aligned} P(hogeを1回以上引く \cap fugaを1回以上引く) &= 1 - P(\overline{hogeを1回以上引く \cap fugaを1回以上引く})\\ &= 1 - P(\overline{hogeを1回以上引く} \cup \overline{fugaを1回以上引く})^{(※注1)}\\ &= 1 - \{P(\overline{hogeを1回以上引く}) + P(\overline{fugaを1回以上引く}) - P(\overline{hogeを1回以上引く} \cap \overline{fugaを1回以上引く}) \}\\ &= 1 - \{P(hogeを1回以上引かない) + P(fugaを1回以上引かない) - P(hogeを1回以上引かない \cap fugaを1回以上引かない) \}\\ &= 1 - \{P(hogeを0回引く) + P(fugaを0回引く) - P(hogeを0回引く \cap fugaを0回引く) \}\\ &= 1 - \{(1 - 0.01)^{100} + (1 - 0.02)^{100} - (1-0.01-0.02)^{100} \}\\ &= 1 - \{0.99^{100} + 0.98^{100} - 0.97^{100} \}\\ &\simeq 1 - \{0.37 + 0.13 - 0.05\}\\ &= 1 - 0.45\\ &= 0.55 \end{aligned} \]

(※注1 ド・モルガンの法則)

となって、55%でhogeを1回以上、fugaを1回以上引けそうですね。

では3つになるとどうなるでしょうか。「hogeを1回以上引く、かつ、fugaを1回以上引く、かつ、piyoを1回以上引く」確率ですね。それぞれ長いので以下のように置き換えます

  • A : hogeを1回以上引く(確率1%)
  • B : fugaを1回以上引く(確率2%)
  • C : piyoを1回以上引く(確率3%)

すると、次のような式になります。

\[ \begin{aligned} &P(hogeを1回以上引く \cap fugaを1回以上引く \cap piyoを1回以上引く)\\ &= P(A \cap B \cap C)\\ &= 1 - P(\overline{A \cap B \cap C})\\ &= 1 - P(\overline{A} \cup \overline{B \cap C})\\ &= 1 - \{P(\overline{A}) + P(\overline{B \cap C}) - P(\overline{A} \cap \overline{B \cap C}) \}\\ &= 1 - \{P(\overline{A}) + (P(\overline{B} \cup \overline{C})) -( P(\overline{A} \cap (\overline{B} \cup \overline{C}))) \}\\ &= 1 - \{P(\overline{A}) + (P(\overline{B}) + P(\overline{C}) - P(\overline{B} \cap \overline{C})) - (P((\overline{A} \cap \overline{B}) \cup (\overline{A} \cap \overline{C}))) \}\\ &= 1 - \{P(\overline{A}) + P(\overline{B}) + P(\overline{C}) - P(\overline{B} \cap \overline{C}) - (P(\overline{A} \cap \overline{B}) + P(\overline{A} \cap \overline{C}) - P((\overline{A} \cap \overline{B}) \cap (\overline{A} \cap \overline{C}))) \}\\ &= 1 - \{P(\overline{A}) + P(\overline{B}) + P(\overline{C}) - P(\overline{B} \cap \overline{C}) - (P(\overline{A} \cap \overline{B}) + P(\overline{A} \cap \overline{C}) - P(\overline{A} \cap \overline{B} \cap \overline{A} \cap \overline{C})) \}\\ &= 1 - \{P(\overline{A}) + P(\overline{B}) + P(\overline{C}) - P(\overline{B} \cap \overline{C}) - P(\overline{A} \cap \overline{B}) + P(\overline{A} \cap \overline{C}) + P(\overline{A} \cap \overline{B} \cap \overline{C}) \}\\ &= 1 - \{(1-0.01)^{100} + (1-0.02)^{100} + (1-0.03)^{100} - (1-0.02-0.03)^{100} - (1-0.01-0.02)^{100} - (1-0.01-0.03)^{100} + (1-0.01-0.02-0.03)^{100} \}\\ &= 1 - \{0.99^{100} + 0.98^{100} + 0.97^{100} - 0.95^{100} - 0.97^{100} - 0.96^{100} + 0.94^{100} \}\\ &\simeq 1- \{0.37 + 0.13 + 0.05 - 0.01 - 0.05 - 0.02 + 0.00 \}\\ &= 1 - 0.47\\ &= 0.53 \end{aligned} \]

となり、53%の確率で目標を達成できそうです。問題なのは、式がこの調子で複雑になると、5つぐらいでもう人間が計算する領域ではなくなり始めますね。定式化すると以下になります

  • \(x\) : 回すガチャの回数
  • \(N\) : 欲しいキャラの数
  • \(a_i\) : \(i(1始まり)\)番目のキャラが出る確率

\[ \begin{aligned} &P(x連で確率a_iで出るSSRをそれぞれ1回以上引く)\\ = &1 - \sum_{i=1}^N (1-a_i)^x + \sum_{i=1}^{N-1} \sum_{j=i+1}^N (1-a_i-a_j)^x - \sum_{i=1}^{N-2} \sum_{j=i+1}^{N-1} \sum_{k=j+1}^N(1-a_i-a_j-a_k)^x + \sum_{i=1}^{N-3} \sum_{j=i+1}^{N-2} \sum_{k=j+1}^{N-1} \sum_{l=k+1}^N (1-a_i-a_j-a_k-a_l)^x \cdots \end{aligned} \]

なんかいまいち綺麗な式にならない……

ガチャ\(x\)連で確率\(a_i\)で出るSSRをそれぞれ\(b_i\)人以上欲しい!

複合です。いわゆるN凸を複数したいときにする計算になりますね。お前のことだよシャニマス、ウマ娘。

これは複雑そうに見えてそうでもありません。今までの複合でできるからですね。

まず欲しいSSRが1つの場合を考えます。これは最初のガチャ\(x\)連で確率\(y\)で出るSSRを\(z\)人欲しい!と同じものですね。

\[ \begin{aligned} P(x連で確率a_1で出るSSRをb_1回以上引く) = = 1 - \sum_{i=0}^{b_1-1} {}_{x}C_{i} * a_1^i * (1-a_1)^{x-i} \end{aligned} \]

2つの場合も考えましょう。

\[ \begin{aligned} &P(x連で確率a_1で出るSSRをb_1回以上引く \cap x連で確率a_2で出るSSRをb_2回以上引く)\\ = &1 - P(\overline{x連で確率a_1で出るSSRをb_1回以上引く \cap x連で確率a_2で出るSSRをb_2回以上引く})\\ = &1 - \{P(\overline{x連で確率a_1で出るSSRをb_1回以上引く}) \cup P(\overline{x連で確率a_2で出るSSRをb_2回以上引く})\}\\ = &1 - \{P(\overline{x連で確率a_1で出るSSRをb_1回以上引く}) + P(\overline{x連で確率a_2で出るSSRをb_2回以上引く}) - P(\overline{x連で確率a_1で出るSSRをb_1回以上引く} \cap \overline{x連で確率a_2で出るSSRをb_2回以上引く}) \}\\ = &1 - \{\sum_{i=0}^{b_1-1} {}_{x}C_i * a_1^i * (1-a_i)^{x-i} + \sum_{i=0}^{b_2-1} {}_{x}C_i * a_2^i * (1-a_2)^{x-i} - \sum_{i=0}^{b_1-1} \sum_{j=0}^{b_2-1} {}_xC_i * a_1^i * {}_{x-i}C_j * a_2^j * (1-a_1 - a_2)^{x-i-j} \} \end{aligned} \]

一気にバチくそ面倒になりましたね。これが3つ4つと増えていくと、ガチャx連で確率a_iで出るssrをそれぞれ1つ以上欲しいと同じように複雑になっていきます。計算どころか立式すらしたくなくなってきます。

定式化すると以下のようになります

  • \(x\) : 回すガチャの回数
  • \(N\) : 欲しいキャラの数
  • \(a_i\) : i(1始まり)番目のキャラが出る確率
  • \(b_i\) : i(1始まり)番目のキャラの欲しい数

\[ \begin{aligned} &P(x連で確率a_iで出るSSRをそれぞれb_i回以上引く)\\ = & 1 - \sum_{i=1}^N \{\sum_{p=0}^{b_i-1} {}_xC_p * a_i^p * (1-a_i)^{x-p} \} + \sum_{i=1}^{N-1} \sum_{j=1}^{N} \{\sum_{p=0}^{b_i-1} \sum_{q=0}^{b_j-1} {}_xC_p * a_i^p * {}_{x-p}C_{q} * a_j^q * (1 - a_i - a_j)^{x-p-q} \} - \sum_{i=1}^{N-2} \sum_{j=1}^{N-1} \sum_{k=1}^N \{\sum_{p=0}^{b_i-1} \sum_{q=0}^{b_j-1} \sum_{r=0}^{b_k-1} {}_xC_p * a_i^p * {}_{x-p}C_{q} * a_j^q * {}_{x-p-q}C_{r} * a_k^r *(1 - a_i - a_j - a_k)^{x-p-q-r} \} + \cdots \end{aligned} \]

計算したくない……

終わりに

改めて確率を計算しようとしたときに一瞬考えてしまったので備忘録的に書きました。間違っていましたら教えていただけると幸いです。