生日悖论

之前接触过,一个40个人的班上,总会有人同一天过生日,最后计算到,40人中,至少同一天过生日的概率非常大(超过80%),这也就是生日悖论。

那么今天又遇到同样的问题,被人问到一下子卡住了。

问题:n个人中,至少两个人有相同生日的概率是多少?当概率大于1/2的时候,n取最小多少?

这个概率一下子没想到,所以搜索了一下:

N个人中,有两个人生日相同的概率是没有人生日在同一天的概率是:C(365,n)n!/(365)^n 所以至少有两个人生日在同一天的概率为:1-C(365,n)n!/(365)^n

https://www.zybang.com/question/61511bc59391c0f7ac9c0767094e49de.html

接下来就是编程计算了,下面给出java代码、matlab代码、python代码,R代码,C语言略:

matlab code:

 

R code:

python code:

python注意格式,所以这里截图:

java code:

package me.yoqi;
public class Test {
 public static void main(String args[]) {
int init = 365;
double pk = 0;
for (int n = 3; n < init; n++) {
pk = 1 - combination(365,n ) * factorial(n) / Math.pow(365, n);
if (pk >= 0.5) {
System.out.println("最小K:" + n);
break;
}
}
}
 /**
* 计算阶乘数,即n! = n * (n-1) * ... * 2 * 1
*
* @param n
* @return
*/
private static long factorial(int n) {
return (n > 1) ? n * factorial(n - 1) : 1;
}
 /**
* 计算排列数,即A(n, m) = n!/(n-m)!
*
* @param n
* @param m
* @return
*/
public static long arrangement(int n, int m) {
return (n >= m) ? factorial(n) / factorial(n - m) : 0;
}
 /**
* 计算组合数,即C(n, m) = n!/((n-m)! * m!)
*
* @param n
* @param m
* @return
*/
public static long combination(int n, int m) {
return (n >= m) ? factorial(n) / factorial(n - m) / factorial(m) : 0;
}
}
注意:
(1)java无法计算365!阶乘,考虑用bigInteger处理比较麻烦。所以说涉及到大数计算,还是考虑专业数学工具,涉及到大数据分析,还是需要分布式计算。
(2)只是为了满足某些看客,编程不在乎何种语言,达到目的即可。
 
代码仓库:http://git.yoqi.me:3000/lyq/yunyin

 博客原文:http://blog.yoqi.me/archives/3184

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值