笔试题——硬币与金币(概率)

题目

( 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



全部评论
我今天刚好也做到了这个题目,有一点,抵消的部分您是不是算错了啊。因为应该始终是1000*...*991 和另一个10个数的连乘法,第三种情况1000是不是不应该减去n?
点赞 回复 分享
发布于 2020-04-21 21:32
你是指第14行应该是“ a2 *= (1000 - i) ”对吧?确实,我写错了。。。多谢指正~
点赞 回复 分享
发布于 2020-04-21 23:01

相关推荐

头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务