解決編:m個の箱にn個のボールをランダムに入れるとき、すべての箱に1個以上のボールが入る確率は?

サイエンス記事

例えば、3個の箱に4個のボールをでたらめに入れていく場合、すべての箱に1個以上のボールが入る確率はいくつか?という問題です。
この場合は、m=3, n=4です。
5年前に解いた時は、数値シミュレーションを使ったり、限定したm、nに限っていました。一般のm, nについて答えを定式化するところまではできていませんでした。

「確率論へようこそ」(G.ボルム/L.ホルスト/D.サンデル著)を読んでいたら包含公式を用いれば良いことがわかりました。
包含公式は以下のとおりです。

$$
P(A_1\cup A_2\cup \cdots \cup A_m) = S_1-S_2+S_3-\cdots+(-1)^{m-1}S_m
$$

$$
S_i =
{m \choose i} \frac{(m-i)^n}{m^n}
$$

$A_i$はi番目の箱にボールが入らない事象です。よってPはいずれかの箱にボールが入らない確率です。1 – Pが求める確率です。

Pythonコードは以下のようになります。任意の自然数m, nについて計算できます。

# ボールn個、箱m個のとき
from scipy.special import comb

def sn(i, n, m):
    #n number of balls
    #m number of boxes
    total = m**n
    ncr0 = comb(m, i)  # m個の箱からi個を選ぶ
    ncr1 = (m-i)**n  # 残りm-i個の箱に重複を許してn個のボールを入れる
    sn = ncr0*(ncr1/total)
    sn = (-1)**(i-1)*sn
    return sn

n = 4  # number of balls
m = 3  # number of boxes
P = 0
for i in range(1, m, 1):
    P += sn(i, n, m)  # 少なくともi個の箱にボールが入らない確率

print("すべての箱に1個以上のボールが入る確率", 1-P)

数値シミュレーションの結果とも一致します。