ガチャ確率計算ツール『ガチャ確率計算機』の紹介と舞台裏

概要

 ガチャ確率計算ツールは、その名の通りガチャ関係の確率計算をしてくれます。具体的には、

  • 「確率X%のガチャを回すと何%の確率でドロップするか」といった計算(確率計算タブ)
  • 「ガチャを回すとX回回してY回出た。何%の確率とみなすのが妥当か」といった計算(確率推定タブ)

があります。
 また、PWA対応ですので、スマホのホーム画面に登録することも可能です。
(PC・Android向けの登録方法紹介ページiOS向けの登録方法紹介ページ)
 しかし、強力さの割に存在感が薄い気がしますので、「使用例」と「何を計算しているのか」をメモしておきます。

※取扱説明書は、ガチャ確率計算ツールのヘルプタブに書いてあります。
※GitHub→https://github.com/YSRKEN/CalcGachaProbTool

確率計算タブについて

 例えば、確率1.5%で目当てがドロップするガチャを100連した場合の結果がこちらになります。

image

 つまり、100連して出る確率は77.9%で、90%の確率で出そうとすると153回回す必要があると分かります。
 賢明な方ならお気づきかもしれませんが、こういった計算は「艦これにおける艦船ドロップや建造」「ポケモンにおけるわざが当たる確率」などにもそのまま利用できます。つまり、名前のイメージとは異なり、ガチャらないゲームにも使えるというわけです。

 計算方法としては、単純にベルヌーイ分布を計算しています。「1回回して当たる確率がXなガチャをY回回した際に全て外す確率」は(1-X)^Yですので、「1回回して当たる確率がXなガチャをY回回した際に1回以上当たる確率」は1-(1-X)^Yです。
 また、「Z以上の確率で当たるまでの試行回数」は、対数を使って算出しています。つまりこういうことです。

1-(1-X)^Y\geq Z
\Leftrightarrow (1-Z)\geq (1-X)^Y
\Leftrightarrow log(1-Z)\geq Y log(1-X)
\Leftrightarrow Y\leq \frac{log(1-Z)}{log(1-X)}

※「log(1-X)が0でない」⇔「Xが0ではない」なので、当たる確率Xが0になる場合はこの計算が(当然)できない

確率推定タブについて

 例えば、ガチャを100連して5回も目当てがドロップした場合、「おかしいな、これ確率1.5%だよね?」となった際の結果がこのようになります。

image

 画面の読み方としては次の通り。

  • 100連しての5回なので、ドロップ率は5%(確率の基本)
  • 同じ(100連して5回当たるような)ガチャを他の人が回した場合、それぞれのドロップ率の分布をプロットすると、95%の範囲で1.7~11.3%の範囲に収まる(信頼区間の定義)
  • p値が0.017693なので、「この(100連して5回当たるような)ガチャを回した際に1.5%以下しか当たりが出ない確率」は1.7693%しかなく、一般的によく使われる有意水準(5%)より低いため、「このガチャの確率表記は正しい」という帰無仮説は棄却される(確率推定)

 より簡単に言えば、
「このガチャを他の人が回した際、95%の人が報告するドロップ率は1.7~11.3%に収まるだろう」
「このガチャの表記が正しい確率は1.8%弱しかないと思われる」
となります。後者が「思われる」語尾なのは、例えば「ガチャった人が幸運だった」「総課金額などの謎の理由で確率がアップしていた」などの理由も考えられるからです。

 計算方法ですが、一言で言えば「R言語に合わせました」。R言語の「binom.test」という関数では、「binom.test(当たりが出た回数, 回した回数, 公表されているドロップ率)」と入力することによって、当たる確率の95%信頼区間・p値が計算されます。ただし、R言語のデフォルトでは、それぞれ別の数式を利用して算出しているため、エミュレートする場合はそれぞれ実装する必要があります。
 まず95%信頼区間ですが、こちらはClopper-Pearson methodが有名です。F分布の逆関数で求めるのが一般的ですが、このページこの資料などのように、ベータ分布の逆関数で求めることもできます。

 95%信頼区間の下限と上限:[B_{(1-\alpha/2)}(n-k+1, k), B_{(\alpha/2)}(n-k, k+1)]

 ただしここで今回の場合、

  • α:1-0.95=0.05を使用(0.95は95%の意味)
  • n:ガチャを回した回数
  • k:ガチャで当たった回数
  • B_{p}(a, b):ベータ分布の逆関数

 また、p値はSterneの手法を使用しました。これは、p値の定義に従い「公表されているドロップ率で回した回数だけガチャった際、『当たった回数=”当たりが出た回数”』になる確率より確率が等しいか低い事象の総和(つまり帰無仮説の元で観測値が生じる確率とそれより小さい確率との総和)」を計算する手法です。TypeScript風に書くとこんな感じです。

/**
 * Sterneの手法によってp値を計算する
 */
get pValue(): number {
    // 他のパラメーター
    const x = 公表されているドロップ率;
    const n = 回した回数;
    const k = 当たりが出た回数;

    // prob(n,k,x)は、1回あたり確率xで成功する事象を
    // n回行ったときにk回成功する確率(ベルヌーイ試行)
    const limitprob = prob(n, k, x);

    // 確率の総和を計算する
    let sum=0.0;
    for (let i = 0; i <= n; ++i) {
        const temp = prob(n, i, x);
        if (limitprob >= temp)
            sum += temp;
    }
    return sum;
}

(参考:検定と区間推定)

この記事へのコメント