2013-04-29 194 views
7

我试图用一个朋友在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 
+1

,我认为是更好的方式使用的Math.random()。 – Gere 2013-04-29 23:48:51

+6

你在创建你的Random实例时使用了一个常数种子。所以当然你会得到相同的数字。 – 2013-04-29 23:51:22

+3

@Gere:'Math.random()'有什么神奇之处,为什么它比使用Random实例更好? – 2013-04-29 23:51:59

回答

23

您已经播种,随机数生成具有恒定值100。它是确定性的,所以每次运行都会产生相同的值。

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

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

从的Javadoc报价为参数的构造函数Random

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

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

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

此:

Random rand = new Random(100); 

你给随机数生成相同的种子(100),每次启动该程序。给它类似于从System.currentTimeMillis()的输出,并应该给你每个调用不同的数字。

1

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

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

0

希望这有助于..

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