概要
「ピックアップ中のキャラを引くには大体どのくらい課金すればいいんだ?」
令和の今を生きる現代人によくある悩みだと思います。
調べれば出てくるとは思うのですが、「この回数引いたら、80%程度で1枚は引けるよね」みたいな確率(以降、保証確率)を算出するものが作りたかったので考えてみました。
次の項を読むだけで数学が苦手な人もエクセルで簡単に実装できるので、数学が苦手な人はそこだけでも読んでもらえると幸いです。
補足:Notionでも実装して公開してみました。
エクセルで実装
上図は「発生確率3%の事象を80%の保証確率で1回以上起こすために必要な回数」を計算したものです。
今回の条件では53回の試行が必要という結果が出力されています。
結論から言うと、これを算出するための式は以下です。(詳しい説明は次項)
n = \log_{1-p}(1-X)
よって、エクセルで表現する場合に必要な式は以下のようになります。
A1:発生確率を示したセル
B1:保証確率を示したセル
=ROUNDUP(LOG(1-B1,1-A1),0)
確率の導出
前述した式がどのように導出されたかの説明をします。
まず、以下のように定義します
p
:発生確率
n
:試行回数
P(n)
:発生確率p
の事象をn
回試行した場合に、1回以上事象が起こる確率(保証確率)
フェーズ1:愚直に実装
「発生確率p
の事象がn
回の試行回数で1回以上発生する事象」は
「発生確率p
の事象がn
回の試行回数で1回も発生しない事象の余事象」であるため、
求めたい確率P(n)
は以下の式で求められます。
P(n)=1 - (1-p)^{n}
よって、エクセルで上の数式を作り各回数ごとの発生確率を表に出力すればn
回行った時の最低1回以上発生する確率が求められます。
フェーズ2:数学的に実装
パターン1でも十分に使えるものではあるのですが、発生確率が低かったりすると回数が膨大に必要になることも考えられてその場合は見づらいです。
自分が最初に欲しいと思ったものは「8割程度の確率でレアを当てるためには、何回ガチャを回す必要があるのか」を出すものだったので、数学的に考えて出力をスマートにしてみました。
パターン1で示したように、P(n)
は以下のようになります。
P(n)=1 - (1-p)^{n}
ここで今回はP(n)
が80%、つまりP(n)=0.8
になるようなn
が求めたいので以下のように代入して、n
について変形することで必要回数n
が求まります。
0.8 = 1-(1-p)^n
今回0.8と置いた確率を保証確率:X
と定義して、n
について変形すると以下の式のようになります。
X=1 - (1-p)^{n}
(1-p)^n = 1-X
log((1-p)^n) = log(1-X)
nlog(1-p) = log(1-X)
n = \frac{log(1-X)}{log(1-p)}
n = \log_{1-p}(1-X)
例として、3%でレアが出るガチャを80%の保証確率で引きたいときに必要な確率を求めるとするとp^ = 0.97, X = 0.8
なので
n = \log_{1-0.03}(1-0.8)≒ 52.84
となるので、53回引けば80%少しの保証確率でレアを引けることが分かります。
感想
「試行回数n回の時の確率の計算って、愚直に計算するとO(n)になって時間かかりそう」って思っていたのですが、O(1)で計算できるとは思いませんでした。
また、計算式がlogを使うだけの簡潔な式になったので、複雑な計算ができないNotionでも実装ができたのは嬉しい誤算でした。
まさか人生でlogの変換公式を役立てる日が来るとは...
追記:
記事を書き終えた後に「二項分布で考えたほうが楽なのでは?」という疑念が