求同一天生日的概率

/**
 * 求同一天生日的概率
 * @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%

posted on 2010-05-19 19:39  台哥编程课堂  阅读(1344)  评论(0编辑  收藏  举报

导航