繁体   English   中英

Java随机类不是真正的随机?

[英]Java Random Class not truly random?

我试图模拟我在http://blog.xkcd.com/2010/02/09/math-puzzle/上找到的数学难题。 但是,java随机类返回了奇怪的结果。 在下面的代码中,结果是预期的结果。 第一行的输出大约为.612,第二行的输出大约为.49到.51。 int试验= 10000000; int success = 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();

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

r的实例移动到for循环外部 ,如:

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

您现在正在做的是每次循环迭代时创建一个新的,并且由于种子基于时间(毫秒),您可能会使用相同的种子获得相当多的。

这几乎可以肯定是什么扭曲了你的结果。

所以,是的,这一个错误,只是在你的代码中而不是在Java中。 在人们提出这个问题的时候,大约有99.9999%的情况就是这种情况,因为Java本身正在被世界各地的数百万人持续测试,而你的片段已经过测试,只有你:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM