これらのバッジが等確率で出現するとした場合、いったい何本 Teao を買えば 全12種類そろうでしょうか?
つまり n 本 (n>=12) かったときに全種類そろう確率を P(n) とした時、 n→∞にしたときの期待値 E を求めてください。
∞
E = Σ n * p(n)
n=12
(defun fact (n)
(if (<= n 1)
1
(* n (fact (1- n)))))
;;;
;;; n 回引いてちょうど k 種類集まる組合せの数:
;;;
;;; k
;;; --- i n
;;; f(k,n) = > (-1) k C (k-i) (k-i)
;;; ---
;;; i=0
;;;
;;; Pr( n 回引いてちょうど k 種類集まる確率)
;;;
;;; = Pr( n-1 回引いてちょうど k-1 種類集まる確率) * 1/k * k
;;;
;;; = f(k-1,n-1) / k^(n-1)
;;;
(defun comb (k n)
(let ((result 0.0d1))
(do ((i 0 (1+ i)))
((> i k) result)
(let ((temp (/ (fact k) (* (fact (- k i)) (fact i)))))
(if (evenp i)
(incf result (* temp (expt (- k i) n)))
(decf result (* temp (expt (- k i) n))))))))
(defun main (k)
(do ((n k (1+ n)))
((> n 100))
(format t "~d~t~d~%" n (/ (comb (1- k) (1- n)) (expt k (1- n))))))
#include#include double fact(int n) { int i,result = 1; for (i=1;i<=n;i++) result *= i; return (double)result; } double comb(int k, int n) { double sum = 0; double tmp; int i; for (i=0;i<=k;i++) { if (i%2 == 0) tmp = 1; else tmp = -1; sum += (tmp * (fact(k)/fact(k-i)/fact(i)) * pow(k-i,n)) ; } return sum; } void main(void) { int n; double p,e = 0; for (n=12;n<=100;n++) { p = comb(12-1,n-1)/pow(12,n-1); e += p*n; printf("%3d %50.50f\n",n,p); } printf("E = %50.50f\n",e); }
この結果を使いグラフを描くと以下のようになります.
横軸が買った本数。縦軸がその本数で全種類そろう確率です。
これを名付けて
E = 37.23
となりました。 37本程度買えばそろうということです。
さらに 累計確率を求めると以下のようになります。 横軸が買った本数。縦軸が、その本数までにそろう確率です。
100本かってそろう確率は 0.998 です。