/**
* 求同一天生日的概率
* @author tiger
* @date 2010-5-13
*
* 注:早上看公司邮件说本月有12名同事生日,
* 突然就想算下有同一天生日的概率是多少。
* 于是写了这段代码。
*
* 发现12个人有同一天生日的概率达到92%啊!
*
*/
public class tiger
{
/**
* 求阶乘
* m 须要是正数
*/
/* private double jiecheng(int m)
{
if(m==0)
{
return 1;
}else{
return m * jiecheng(m-1);
}
}*/
/**
* 求组合(m选n)
* m、n 须要是正数且m>n
*/
private double zuhe(int m, int n)
{
double d = 1;
while(n>0)
{
d = d * m;
m--;
n--;
}
return d;
}
/**
* 求m的n次方
*/
private double ncFang(int m, int n)
{
double d = 1;
while(n>0)
{
d = d * m;
n--;
}
return d;
}
/**
* manNum个人,生日都在同一时间段,时间段是dayRange天。
* 求他们中有两个或多个人同一天生日的概率。
* @return 概率字符串
*/
private String getGaiLv(int manNum,int dayRange)
{
if(manNum > dayRange) //人数大于天数,概率是百分之百。
{
return 100 + "%";
}else{
//double x = this.jiecheng(dayRange);
//double y = this.jiecheng(dayRange - manNum);
//double fenzi = x / y;
double fenzi = this.zuhe(dayRange, manNum);
System.out.println("fenzi = " + fenzi);
double fenmu = this.ncFang(dayRange, manNum);
System.out.println("fenmu = " + fenmu);
return (100 - fenzi * 100 / fenmu) + "%";
}
}
public static void main(String[] args)
{
int manNum = 15;
int dayRange = 30;
String str = new tiger().getGaiLv(manNum, dayRange);
System.out.println("生日同在某个" + dayRange + "天时间段内的" + manNum + "个人中有相同生日的概率是" + str);
}
}
//以下是打印的一些结果:
//生日同在某个30天时间段内的15个人中有相同生日的概率是98.58635082845176%
//生日同在某个30天时间段内的12个人中有相同生日的概率是92.20414059807956%
//生日同在某个20天时间段内的8个人中有相同生日的概率是80.15972500000001%
//生日同在某个20天时间段内的5个人中有相同生日的概率是41.86%
//生日同在某个10天时间段内的2个人中有相同生日的概率是10.0%
//生日同在某个10天时间段内的1个人中有相同生日的概率是0.0%