在Java中模拟几何分布

时间:2013-08-13 10:56:20

标签: java random probability

有一个面试问题如下, “在某些地方,人们喜欢女孩比男孩更多。一旦夫妻生了一个女孩,他们就不会考虑生第二个孩子。相反,如果第一个孩子不是女孩,他们将会有第二个孩子。孩子......直到他们有一个女孩。假设得到一个女孩的概率是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;
    }
}
}

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

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

2 个答案:

答案 0 :(得分: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;
 }
}

关于几何分布,有数学库提供几何分布的实现,如math uncommonsJDistLib

答案 1 :(得分: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范围内均匀分布随机[0,1]