当前位置: 首页 > 知识库问答 >
问题:

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

百里修真
2023-03-14

我正在尝试模拟我在上面发现的数学难题http://blog.xkcd.com/2010/02/09/math-puzzle/.然而,java random类返回了奇怪的结果。在下面的代码中,结果是预期的。第一行的输出大约为.612,第二行的输出介于.49和.51之间。int试验=10000000;int成功=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() 方法在以后的配置中返回 true 的概率为 70%。我做错了什么还是这只是一个错误?

共有1个答案

余弘新
2023-03-14

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

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

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

几乎可以肯定的是,这会影响你的结果。

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

 类似资料:
  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由

  • 问题内容: 我正在尝试在Java中生成盐,以与用于安全密码存储的哈希算法配合使用。我正在使用以下代码创建随机盐: 这应该生成一个完全安全的,随机生成的盐,以用于我的哈希算法。但是,当我运行代码时,每次都会输出相同的盐…表示生成的盐根本不是随机的。 出于明显的安全性目的,每个用户都需要一个唯一的符号,但是如果我每次创建一个新帐户时都使用此代码,则每个用户都将具有相同的符号,这一开始就破坏了它的用途。

  • 问题内容: 我正在阅读Math.random()javadoc,发现random只是psuedorandom。 是否有一个库(特别是java)根据随机变量(例如环境温度,CPU温度/电压等)生成随机数? 问题答案: 查看http://random.org/ RANDOM.ORG是一种真正的随机数服务,可通过大气噪​​声生成随机性。 可以在以下位置找到用于与其连接的Java库: http //sou

  • 一个简单的新手问题,奇怪的是我一直没能找到解决方法。

  • Java常用的库包括和(我还看到)。还有其他人吗?我什么时候用每一个?有时我使用只是为了对我的简单数字感觉更好。事实证明,实际上允许您选择生成器。我该如何和什么时候使用这个? 最后,Java8提供了。我不知道这是什么,但它比以前的任何一个都要慢得多。应该如何以及何时使用?还有,慢是不是因为噪声源快用完了?

  • 问题内容: 例如,可以将其用于生成一次性填充密钥吗? 另外,它的来源是什么,如何将其用于生成 x 和 y 之间的随机数? 问题答案: 在这个宇宙中,唯一可以真正考虑的是基于量子效应的宇宙。常见的例子是放射性衰变。对于某些原子,您只能确定其半衰期,但不能确定下一个原子核会破裂。 关于-取决于实现。在Linux中,它用作熵源: Linux内核根据键盘时序,鼠标移动和IDE时序生成熵,并通过特殊文件/