ガチャピンモードとは
グランブルーファンタジーというソシャゲで、SSR(フェス時6%、それ以外は3%)が出るまで無料10連ガチャをいくらでも回せる機能です。(本当は終了条件があるのですが、本記事では割愛します)
SSRが確定ということもあり、少なくとも虚無にはならないという安心の一方で、ガチャをたくさん回せるということはSSRが出ていないということで、実は損なのでは?という気分にもなってしまいます。そのあたりを、数学の力を借りて調べましょう。
高校数学の知識があれば読むことが出来ます。何言ってるかワカランという方は、今後確率に首を突っ込むのはやめましょう。危険です。
以下、SSR出現確率を$p$とします。
10連ガチャにおけるSSR期待値
ガチャ1回あたりの期待値が$p$ですから、$10p$です。期待値の線形性はかくも偉大。
……なのですが、今後のために愚直に計算しておきましょう。
期待値は(SSRの出た個数)x(その個数のSSRが出る確率)の和で表されるのでした。SSRがk個出る確率を$a_k$とおくと、期待値$P$は次のようになります。
P = \sum^{10}_{k=0}ka_k
$a_k$は $a_k = {}_{10}\mathrm{C}_k p^k (1-p)^{10-k}$ですので、結局
P = \sum^{10}_{k=0}k_{10} \mathrm{C}_k p^k (1-p)^{10-k}
となります。これが10pと一致することは読者への演習問題としますが、一致することだけわかっていれば大丈夫です。
ガチャピンモードのSSR個数期待値
10連でSSRが一回も出なかった場合は、また次の10連を回すわけですから、その10連は個数という観点からはなかったことと同じです。結局、10連ガチャでSSRが1個以上出たときの、SSR数の期待値を求めることになります。条件付き確率というやつですね。
基本的には上の計算方法と同じですが、kの範囲と確率が異なる点に注意しましょう。SSRがk個出る確率は$\frac{a_k}{1-a_0}$です。こうなります。
P = \sum^{10}_{k=1}k \frac{ a_k } {1-a_0}
このままでは扱いづらいので、変形します。まず、シグマの中にkがあるので、k=0を含めても問題ありません。また、$\frac{1}{1-a_0}$はkによらないため、外に出すことが出来ます。よって次のようになります。
P = \frac{1}{1-a_0} \sum^{10}_{k=0}ka_k
あれあれ、この式のシグマ以降は先程求めた期待値そのものではないですか(しらじらしい)。結局期待値は次のようになります。
P = \frac{10p}{1-(1-p)^{10}}
実際に計算すると、フェス(p=0.06)で1.3個、それ以外(p=0.03)で1.14個となります。
ガチャピンモードのSSR率
SSRの数/ガチャを回した数 で計算される数値をSSR率とします。ガチャピンモードのSSR率はどうなのでしょうか?。SSRの期待値は計算しましたから、ガチャを回す回数の期待値を計算しましょう。
10連一回でSSRが1個以上出る確率は、$1-a_0 = 1-(1-p)^{10}$でした。一般に確率pのガチャを出るまで回したときの回数の期待値は$1/p$です。いま、「SSRを出す」というガチャを回していると考えると、ガチャピンモードでガチャを回せる回数の期待値は
\frac{10}{1-(1-p)^{10}}
となります。10連ガチャ一回につき10回のガチャを回すので、10を掛けました。
さて、SSR率は SSR数の期待値 / ガチャを回す数の期待値 で求まります。
\frac{10p}{1-(1-p)^{10}} \div \frac{10}{1-(1-p)^{10}} = p
答えは$p$となりました。すなわちガチャピンモードでSSR率が低くなったりすることはない、ということです!これで安心してガチャを回せますね。
実験
ここはQiitaなので、このまま終わるとなんか怒られそうです。ということで、Pythonでシミュレーションプログラムを書いて、結果があってるのか確かめてみました。
プログラムがこちら。
import random
P = 6
N = 10000
def gacha():
result = random.uniform(0, 100)
if result < P:
return 1
else:
return 0
def gacha10():
ssr = 0
for _ in range(10):
ssr += gacha()
return ssr
def gachaping():
ssr = 0
n = 0
while ssr == 0:
n += 10
ssr = gacha10()
return ssr, n
if __name__ == "__main__":
ssrnum = 0
gachanum = 0
for _ in range(N):
ssr, n = gachaping()
ssrnum += ssr
gachanum += n
print(float(ssrnum) / N) #SSR数の期待値
print(float(ssrnum) / gachanum) #SSR率
結果は……
1.3092
0.06027901837101156
ということで、計算はあってそうです。めでたしめでたし。
とはいえ
SSR個数の期待値は、フェス(p=0.06)で1.3個、通常(p=0.03)で1.14個でした。ガチャそのものの期待値で言えば、フェスでは22連相当、通常では38連相当です。今やってるガチャピンでは30連が出ることもありますから、期待値だけみれば、フェスでのガチャピンの期待値は30連より低い、ということになります。ただ、ガチャピン様はSSR一個以上確定なのに対して、ただガチャを回す場合はSSR0のこともありますから、一概に比較はできません。
まとめ
- ガチャピンモードのSSR数期待値は、フェス(p=0.06)で1.3個(22連相当)、通常(p=0.03)で1.14個(38連相当)
- フェスでは30連のほうが期待値で勝る場合もあるが、SSR確定の恩恵もあるため、一概に優劣はつけられない。
- SSR率は通常のガチャと同じ。
ちなみに
SSRが出たところで止めてもSSR率が変わらないということは、あらゆるガチャにおいて、出たところで止めても確率は変わらないということです。レア泥掘りの検証とかで、「出たとこでやめると本当の確率は出ないから、固定回数分試行して報告しろ」とかいう人がいますが、数学的には間違いだということですね。