【问题标题】:Java random numbers not random?Java随机数不是随机的?
【发布时间】:2013-04-29 23:44:37
【问题描述】:

我正试图向一位朋友解释 Java 中的随机数生成器,但他每次运行程序时都得到相同的数字。我创建了自己的更简单版本的同一件事,我也得到了他每次运行程序时得到的完全相同的数字。

我做错了什么?

import java.util.*;

public class TestCode{
   public static void main(String[] args){
       int sum = 0;
       Random rand = new Random(100);
       for(int x = 0; x < 100; x++){
           int num = (rand.nextInt(100)) + 1;
           sum += num;
           System.out.println("Random number:" + num);
       }
       //value never changes with repeated program executions.
       System.out.println("Sum: " + sum); 
   }

}

100 个数字中的最后五个数字是:

40
60
27
56
53

【问题讨论】:

  • 我认为使用 Math.random() 更好。
  • 您在创建 Random 实例时使用了常量种子。所以当然你会得到相同的数字。
  • @Gere:Math.random() 有什么神奇之处,为什么它比使用 Random 实例更好?
  • 在这种情况下使用 int num = (int) (Math.random()* 100);似乎更好。就是这样。
  • “任何考虑产生随机数字的算术方法的人当然都处于一种罪恶状态”——约翰·冯·诺依曼

标签: java random


【解决方案1】:

希望这有帮助..

Random r = new Random(System.currentTimeMillis());
double[] rand = new double[500];
for(int i=0;i<100;i++){
    rand[i] = r.nextDouble();
    //System.out.print(rand[i] + "\n");
}
//System.out.println();
return rand[randomInt];

【讨论】:

    【解决方案2】:

    您已使用常数值100 为随机生成器播种。它是确定性的,因此每次运行都会生成相同的值。

    我不知道你为什么选择用100播种,但种子值与生成的值的范围无关(这是由其他方式控制的,例如对nextInt的调用你已经有了)。

    要每次获取不同的值,请使用不带参数的Random 构造函数,它使用系统时间来为随机生成器播种。

    引用 Javadoc 的无参数 Random 构造函数:

    创建一个新的随机数生成器。此构造函数设置种子 随机数生成器的值很可能是不同的 从此构造函数的任何其他调用。

    在无参数Random构造函数中引用实际代码:

    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }
    

    【讨论】:

      【解决方案3】:

      这个:

         Random rand = new Random(100);
      

      每次启动程序时,您都会为随机数生成器提供相同的种子 (100)。给它一些类似于System.currentTimeMillis() 的输出的东西,这应该为每次调用提供不同的数字。

      【讨论】:

        【解决方案4】:

        随机数生成器实际上只是伪随机的。也就是说,他们使用确定性方法生成在给定特定统计标准的情况下随机出现的序列。

        Random(long seed) 构造函数允许您传入确定伪随机数序列的种子。

        【讨论】:

          猜你喜欢
          • 2012-10-04
          • 2015-03-27
          • 2011-11-07
          • 1970-01-01
          • 2014-04-27
          • 2013-11-12
          • 2015-09-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多