有一个面试问题如下, “在某些地方,人们喜欢女孩比男孩更多。一旦夫妻生了一个女孩,他们就不会考虑生第二个孩子。相反,如果第一个孩子不是女孩,他们将会有第二个孩子。孩子......直到他们有一个女孩。假设得到一个女孩的概率是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()放出随机方法之后,我得到了预期的结果。
答案 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 uncommons和JDistLib
答案 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]
。