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