0

有这样一个面试题,“在某些地方,人们喜欢女孩多过男孩。夫妻一旦有了女孩,就不会考虑生二胎。相反,如果第一个孩子不是女孩,他们将要生第二个孩子……直到生女孩。假设生女孩的概率是 50%,那么女孩和男孩的比例是多少。”

从几何分布来看,比例为1:1。

我想在 Java 中模拟比率。这是我的代码,

package art.programming.algorithm;

import java.util.Random;

public class Probability {
private int numOfGirls = 0;
private int numOfBoys = 0;

private void random(){
    if (new Random().nextInt(1000000) >= 500000){
        numOfGirls = numOfGirls + 1;
        return;
    }
    numOfBoys = numOfBoys + 1;
    random();
}

public static void main(String... args){
    Probability p = new Probability();
    for (int j=0; j<100; j++){
        System.out.println( j + " test");
        for (int i=0; i<10000000; i++){
            p.random();
        }
        System.out.println("Boys " + p.numOfBoys);
        System.out.println("Girls " + p.numOfGirls);
        p.numOfBoys=0;
        p.numOfGirls=0;
    }
}
}

然而,结果表明男孩的数量总是大于女孩的数量。从这些帖子中,为什么随机不那么随机?http://engineering.mit.edu/live/news/1753-can-a-computer-generate-a-truly-random-number,我猜如果没有特定的硬件支持,就无法生成真正的随机性。结果,无法模拟几何分布?我想知道是否有办法提高随机性,使男孩与女孩的比例有时为 10030100:10000000,有时为 9999100:10000000。

编辑:将新的 Random() 从随机方法中取出后,我得到了预期的结果。

4

2 回答 2

0

以下是您如何对一对夫妇的男孩和女孩数量进行抽样。你可以简单地重复这个过程并总结大量夫妻中的男孩和女孩来进行你的实验。

boys = 0
girls = 0

while true
   is_girl = random() < 0.5
   if (is_girl)
       girls = girls + 1
       break
   else
       boys = boys + 1
       continue

这里random()得到一个随机double均匀分布在 range 中[0,1]

于 2013-08-13T17:34:47.577 回答
0
private void random(){
    if (new Random().nextInt(1000000) >= 500000){
        numOfGirls = numOfGirls + 1;
        return;
    }
    numOfBoys = numOfBoys + 1;
    random();
}

应更改为(以避免可能的堆栈溢出...)

private void random(){
Random randomGen=new Random(1000000);
while(true){
    if (randomGen.nextInt() >= 500000){
        numOfGirls = numOfGirls + 1;
        return;
    }
    numOfBoys = numOfBoys + 1;
 }
}

关于几何分布,有一些数学库提供几何分布的实现,如数学罕见JDistLib

于 2013-08-13T11:33:55.583 回答