题目:有一个国家(我发誓不是中国 - 译者),人人希望生男孩,每个家庭都会不断地要孩子,如果是女孩,会继续要,直到生下男孩为止,最终这个国际的男女比例将是多少?
- /**
- *
- * 题目:有一个国家(我发誓不是中国 - 译者),人人希望生男孩,每个家庭都会不断地要孩子,如果是女孩,会继续要,直到生下男孩为止,最终这个国际的男女比例将是多少?
- *
- * 生男女,假设生到第n个是男孩。
- * 男:女=n/(1+...n-1)
- * 取概率
- * 加权平均
- * n=1 加权值0.5
- * n=2 加权值0.25 ....
- * 然后算出合理的n值
- * 就可以得出男女比例
- * 男:女 =n/(1+...n-1) =n/((1+n-1)*(n-1)/2) =2/n-1 #n!=1,{n=1|1}
- * @param max
- * 生n(n=max)个,包含了生n-1,n-2...1的可能性。
- */
- public static void calcRate(int max) {
- List<Integer> girlList = new ArrayList<Integer>();
- // 生女概率
- List<Double> girlRate = new ArrayList<Double>();
- for (int n = 1; n <= max; n++) {
- if (n == 1) {
- girlList.add(0);
- } else {
- // 1+2+...+(n-1)
- int total = 0;
- for (int i = 1; i < n; i++) {
- total += i;
- }
- girlList.add(total);
- }
- double currentGirlRate = Math.pow(0.5f, n);
- girlRate.add(currentGirlRate);
- }
- double rate = 0;
- for (int i = 0; i < max; i++) {
- //附上加权值
- if (i == 0) {
- rate += 1 * (1 - girlRate.get(i));
- } else {
- rate += (1d / girlList.get(i)) * (1 - girlRate.get(i));
- }
- }
- NumberFormat nf = NumberFormat.getNumberInstance();
- System.out.println("生" + max + "个,男:女=" + nf.format(rate));
- }
运行结果:
生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