Java的随机数不是随机的?(Java random numbers not random?)

2019-09-01 10:06发布

我试图解释在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

Answer 1:

你已经有一个恒定的种子值,随机数发生器100 。 这是确定的,因此,将产生相同的值每次运行。

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

每次得到不同的值,可以使用Random构造不带参数,它使用系统时间的种子随机发生器。

从Javadoc中对参数的引用Random构造函数:

创建一个新的随机数发生器。 此构造将随机数发生器的种子来很可能是从该构造的任何其它调用不同的值。

引用的参数的实际代码Random构造函数:

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


Answer 2:

这个:

   Random rand = new Random(100);

你给随机数生成相同的种子(100),每次启动程序的时间。 给它像从输出System.currentTimeMillis()和应该给你每次调用不同的号码。



Answer 3:

随机数生成器是真的仅仅是伪随机的。 也就是说,它们使用确定性的装置,以产生出现随机给予一定的统计标准序列。

Random(long seed) constuctor允许在确定伪随机数的序列的种子通过。



Answer 4:

希望这可以帮助..

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];


文章来源: Java random numbers not random?
标签: java random