生男女比例题解

题目:有一个国家(我发誓不是中国 - 译者),人人希望生男孩,每个家庭都会不断地要孩子,如果是女孩,会继续要,直到生下男孩为止,最终这个国际的男女比例将是多少?

 

  1. /**
  2.      * 
  3.      * 题目:有一个国家(我发誓不是中国 - 译者),人人希望生男孩,每个家庭都会不断地要孩子,如果是女孩,会继续要,直到生下男孩为止,最终这个国际的男女比例将是多少?
  4.      * 
  5.      * 生男女,假设生到第n个是男孩。
  6.      * 男:女=n/(1+...n-1) 
  7.      * 取概率 
  8.      *  加权平均 
  9.      *      n=1 加权值0.5 
  10.      *      n=2 加权值0.25 ....
  11.      * 然后算出合理的n值 
  12.      * 就可以得出男女比例 
  13.      * 男:女 =n/(1+...n-1) =n/((1+n-1)*(n-1)/2) =2/n-1 #n!=1,{n=1|1}
  14.      * @param max
  15.      *            生n(n=max)个,包含了生n-1,n-2...1的可能性。
  16.      */
  17.     public static void calcRate(int max) {
  18.         List<Integer> girlList = new ArrayList<Integer>();
  19.         // 生女概率
  20.         List<Double> girlRate = new ArrayList<Double>();
  21.         for (int n = 1; n <= max; n++) {
  22.             if (n == 1) {
  23.                 girlList.add(0);
  24.             } else {
  25.                 // 1+2+...+(n-1)
  26.                 int total = 0;
  27.                 for (int i = 1; i < n; i++) {
  28.                     total += i;
  29.                 }
  30.                 girlList.add(total);
  31.             }
  32.             double currentGirlRate = Math.pow(0.5f, n);
  33.             girlRate.add(currentGirlRate);
  34.         }
  35.         double rate = 0;
  36.         for (int i = 0; i < max; i++) {
  37.             //附上加权值
  38.             if (i == 0) {
  39.                 rate += 1 * (1 - girlRate.get(i));
  40.             } else {
  41.                 rate += (1d / girlList.get(i)) * (1 - girlRate.get(i));
  42.             }
  43.         }
  44.         NumberFormat nf = NumberFormat.getNumberInstance();
  45.         System.out.println("生" + max + "个,男:女=" + nf.format(rate));
  46.     }

 

运行结果:

生n个,包含了生n-1,n-2...1的可能性。

 

// 生2个,男:女=1.25
// 生3个,男:女=1.542
// 生4个,男:女=1.698
// 生5个,男:女=1.795
// 生6个,男:女=1.86
// 生7个,男:女=1.908
// 生8个,男:女=1.943
// 生9个,男:女=1.971
// 生10个,男:女=1.993
// 生100个,男:女=2.173
// 生1000个,男:女=2.191
// 生10000个,男:女=2.193
// 生100000个,男:女=2.193

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值