Java随机数不是随机的?

我试图用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 

你已经为随机生成器播种了一个常数值100 。 它是确定性的,因此每次运行都会生成相同的值。

我不确定为什么你选择用100播种它,但种子值与生成的值的范围无关(由其他方法控制,例如你已经拥有的nextInt调用)。

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

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

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

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

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

这个:

  Random rand = new Random(100); 

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

随机数生成器实际上只是伪随机数。 也就是说,他们使用确定性手段来生成在某些统计标准下随机出现的序列。

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

希望这可以帮助..

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