笔试题——硬币与金币(概率)
题目
( 2020/2/28 晚刚做的笔试。当时就差一点了,有点遗憾,还是做出来吧。)
1000枚硬币中有10枚金币,现在随机取n枚硬币,取到金币的概率是多少?(保留六位小数)
思路
首先:1000枚硬币分为10枚金币与990非金币。若n大于990,则必定取到金币。
取到金币的概率 = 1 - 没有取到金币的概率。
所以,我们只需要计算没有取到金币的概率即可。
现在我们需要用到排列组合了。
没有取到金币的概率 = 所取n枚硬币全为非金币的概率 = 在990枚非金币中随机取n枚的组合数量 / 在1000枚硬币中随机取n枚的组合数量。
在m个物体中随机无序的取出n个物体,有 C(n, m) 种取法。
(PS:由于markdown没法输入数学公式,就把 C(n, m) 想象成 n在右上角,m在右下角吧~)
所以,没有取到金币的概率 = C(n, 990) / C(n, 1000) =
(990 * 989 * 988 * … ) / ( 1000 * 999 * 998 * …)
其中分子分母各有n项。
可以看出,从n大于10开始,分子分母就有重复的数可以约分一些了。否则,计算出来的数会过大。
所以还要区分n小于等于10和n大于10的情况。
function func(n) { if (n > 990) { return '1.000000'; } else { let a1 = 1, a2 = 1; if (n <= 10) { for (let i = 0; i < n; i++) { a1 *= (990 - i); a2 *= (1000 - i); } } else { for (let i = 0; i < 10; i++) { a1 *= (990 - n + i); a2 *= (1000 - i); } } let noGold = a1 / a2; let p = 1 - noGold; return p.toFixed(6); } }
结果:
console.log(func(11)); // 0.114210 console.log(func(98)); // 0.649179 console.log(func(9)); // 0.086817 console.log(func(50)); // 0.408976 console.log(func(888)); // 1.000000