2012-11-23 60 views
4

我想模拟http://blog.xkcd.com/2010/02/09/math-puzzle/上找到的数学难题。然而,java随机类正在返回奇怪的结果。在下面的代码中,结果是预期的。第一行输出约为.612,第二行输出在.49和.51之间。 int trials = 10000000; int success = 0;Java随机类不是真正的随机?

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。我做错了什么或者这只是一个错误?

+0

@bmargulies我认为它不够可怕。但它绝对过于本地化。 –

+0

这只是另一个拥有太多“随机”对象的人。 – bmargulies

+0

呃,那个提议的傻瓜根本就不是傻瓜!这个问题有一个完全不同的问题,因为随机数发生器根本不是在循环内部构建的。我全部是为了解决重复的问题,但只有当他们是真实的而不是想象中的愚蠢时:-) – paxdiablo

回答

12

移动rfor循环的实例,如:

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

你现在正在做的是创造一个新的每次循环迭代和时间,因为种子是基于时间(毫秒),你可能会得到不少与相同的种子。

这几乎可以肯定是什么造成了结果的偏差。

所以,是的,它是一个错误,只是在代码,而不是在Java中。当人们提出这个问题时,大约有99.9999%的情况是这种情况,因为Java本身不断被全球数百万人测试,而且你的片段已经过测试,只有你:-)