对于Random,有点不太明白,做了个简单的实验。如下:package com.thinkingInJava;
import java.util.*;
public class RandomTest { public static void main(String[] args) {
Random rand = new Random();
for(int i = 0; i < 10; i ++)
System.out.print(rand.nextInt(10) + " ");
}}此时,每运行一次,产生的结果都会不同。但是,如果在变量rand的声明那句写成Random rand = new Random(1);即给Random随便指定一个种子,
此时不管运行多少次,结果都是一样的。而且指定不同的种子,产生的结果也不同。这是啥原因呢?那个种子到底有啥用?貌似JDK上说的也不是很清楚。

解决方案 »

  1.   

    自己找了个差不多的答案:
    (1) 首先请打开Java Doc,我们会看到Random类的说明: 此类的实例用于生成伪随机数流,此类使用 48 位的种子,该种子可以使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证实现这种特性,我们为类Random指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。 Java Doc对Random类已经解释得非常明白,我们的测试也验证了这一点。 (2) 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,我们可以非常明确地看到这一点。    /**   
         * Creates a new random number generator. Its seed is initialized to   
         * a value based on the current time:  
         * <blockquote><pre>  
         * public Random() { this(System.currentTimeMillis()); }</pre></blockquote>  
         *  
         * @see     java.lang.System#currentTimeMillis()  
         */  
       public Random() { this(System.currentTimeMillis()); }  
      

  2.   

    Random rand = new Random();  构造函数不传入种子,实际效果是以当前时间纳秒值作为种子的。所以每次都能够产生不同的随机数
    如果使用相同的种子,产生的随机数当然相同。
      

  3.   

    Random 就是这样的,这叫【伪随机数】
    相同的种子产生相同的序列。
      

  4.   

    Random rm = new Random();
    rm.setSeed(XX);  设置种子,这样每次都随机同样的数·