【问题标题】:simulate the geometry distribution in Java在 Java 中模拟几何分布
【发布时间】:2013-08-13 10:56:19
【问题描述】:

有一个面试题如下, “有些地方,人们喜欢女孩多过男孩。夫妻一旦有了女孩,就不会考虑生二胎。相反,如果第一个孩子不是女孩,他们就会生二胎。”孩子……直到他们有了女孩。假设生女孩的概率是 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() 从随机方法中取出后,我得到了预期的结果。

【问题讨论】:

  • 你的意思是simulate
  • 对于 99% 的应用程序,来自 java 的随机数可以被认为是真正随机的。你不需要真正的随机数
  • enter code here 表明这是家庭作业。是吗?
  • @Gunslinger or sb 谁是新人
  • 我得到了预期的行为。除此之外,您可以通过在每次调用时不创建新的Random很多加速代码。

标签: java random probability


【解决方案1】:
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

【讨论】:

  • 但是很有帮助和很好的设计。它不能解决问题。
  • 是的,避免递归以防止潜在的堆栈溢出。
【解决方案2】:

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

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] 范围内。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2011-08-12
    • 2017-12-14
    • 1970-01-01
    • 2013-09-12
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多