4

我正在尝试模拟我在http://blog.xkcd.com/2010/02/09/math-puzzle/上找到的数学难题。但是,java 随机类返回奇怪的结果。在下面的代码中,结果是预期的。第一行的输出在 0.612 左右,第二行的输出在 0.49 和 0.51 之间。整数试验 = 10000000;诠释成功 = 0;

    int returnstrue = 0;

    for (int i = 0; i < trials; i++) {
        Random r = new Random();
        //double one = r.nextDouble()*10000;
        //double two = r.nextDouble()*10000;
        double one = 1;
        double two = Math.PI;


        double check = r.nextDouble();
        boolean a = r.nextBoolean();


        if(a)
        {
            returnstrue++;
        }
        if(a){
            if((check>p(one)) && two > one)
            {
                success++;
            }
            if((check<p(one))&& two<one)
            {
                success++;
            } 
        }
        else{
            if((check>p(two)) && two < one)
            {
                success++;
            }
            if((check<p(two))&& two>one)
            {
                success++;
            }      
        }
    }
    System.out.println(success/(double)trials);
    System.out.println(returnstrue/(double)trials);

但是,当我切换

 double check = r.nextDouble();
 boolean a = r.nextBoolean();

  boolean a = r.nextBoolean();
  double check = r.nextDouble();

第一个数字的输出约为 0.476,第二个数字约为 0.710。这意味着 nextBoolean() 方法在后面的配置中有 70% 的时间返回 true。我做错了什么还是这只是一个错误?

4

1 回答 1

13

将 的实例化移到r循环外,如下所示for

Random r = new Random();
for (int i = 0; i < trials; i++) {
    :
}

您现在所做的是在每次循环迭代时创建一个新的,并且由于种子是基于时间(毫秒)的,因此您很可能会得到很多具有相同种子的种子。

几乎可以肯定,这就是扭曲您的结果的原因。

所以,是的,这一个错误,只是在您的代码中而不是在 Java 中。在大约 99.9999% 的情况下,当人们问这个问题时,情况往往是这样,因为 Java 本身正在不断地被全世界数以百万计的人测试,而你的代码片段已经被测试了,好吧,只有你 :-)

于 2012-11-23T21:34:28.020 回答