例えば、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)
数値シミュレーションの結果とも一致します。

