题目
( 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

京公网安备 11010502036488号