みなさん、GOD引いてますか?
今年の12月でハーデスは撤去ですね、ってことで記事を書きます。
ロジック
GODを引く確率をp(=1/8192)とします。
n回回したときに、g回GODを引く確率は
{}_n C_g(1-p)^{n-g}p^g\\
g \leq n
となります。
n回回したときに、少なくとも1回以上GODを引く確率は
1-(1-p)^{n}
となります。
n回回したときに、少なくともg(≧1)回以上GODを引く確率は
1-(1-p)^{n}-\sum_{i=1}^{g-1} {}_n C_i(1-p)^{n-i}p^i
となります。
例1:
2000回回したときに、1回GODを引く確率
\begin{align}
&{}_{2000} C_1(1-1/8192)^{2000-1}(1/8192)^1\\
&\fallingdotseq0.1912748\\
&=19.12748{\%}
\end{align}
例2:
4000回回したときに、3回以上GODを引く確率
\begin{align}
&1-(1-1/8192)^{4000}-\sum_{i=1}^{3-1} {}_{4000} C_i(1-1/8192)^{4000-i}(1/8192)^i
\\
&\fallingdotseq0.0135081\\
&=1.35081{\%}
\end{align}
プログラム
プログラムはこちらから動かすことができます。
$('#calc').click(() => {
const p = 1 / 8192;
const n = parseInt($('#trial_number').val());
const g = parseInt($('#god_number').val());
if(n < g) {
$('#probability').text('入力値が不正です');
return;
}
let gp;
if($('input[name=type]:checked').val() === 'equal') {
// GODを指定回数引く
gp = math.combinations(n, g) * Math.pow(p, g) * Math.pow(1 - p, n - g);
} else {
// GODを指定回数以上引く
if(g === 0) {
$('#probability').text('入力値が不正です');
return;
}
let mgp = 0.0;
for(let i = 1; i <= g - 1; i++) {
mgp += math.combinations(n, i) * Math.pow(p, i) * Math.pow(1 - p, n - i);
}
gp = 1 - Math.pow((1 - p), n) - mgp;
}
gp *= 100;
$('#probability').text(gp.toFixed(5) + '%');
});