问题描述
有m个球,要扔到n个盒子里。其中每个球都是互相独立地扔。问最后平均有几个盒子是有球的?
问题解析
这类问题是较为纯粹的数学问题,当然也可以用计算机精确地求出答案。
方案一:编程解决
- p(m, i):表示前 m 个球,扔到 n 个盒子里,共占用了 i 个盒子的概率
于是 p(m, i) = p(m-1, i) * (i/n) + p(m-1, i-1) * (n-i+1)/n
p(m, i) = 0, if i <= 0 || i > m || i > n
于是可以就可以根据上述式子编程解决,复杂度是 O(m^2)
方案二:数学分析
- p(m): 表示前 m 个球放到 n 个盒子里,其平均占用的盒子数量 (注意:这里是期望数量)
p(m) = (p(m-1)/n) * p(m-1) + (1 - (p(m-1)/n ) * (p(m-1) + 1)
上述式子的意义在于,当求 p(m) 时,可以认为第 m 个球恰好落在前 m-1 个球所在的某个盒子中,概率为 p(m-1) / n;或者是第 m 个球落在一个空的盒子中,概率是 1-p(m-1)/n
化简得到: p(m) = 1 + (n-1)/n * p(m-1).
进一步: p(m) - n = (n-1)/n * ( p(m-1) - n)
进一步: p(m) - n = ( (n-1)/n ) ^ m * (-n)