Java随机数不是随机的?

时间:2013-04-29 23:44:38

标签: java random

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

4 个答案:

答案 0 :(得分:23)

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

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

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

从Javadoc引用无参数nextInt构造函数:

  

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

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

Random

答案 1 :(得分:2)

此:

   Random rand = new Random(100);

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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];