写出如下代码的运行结果和原因
import java.util.Random;public class T {
  static void test() {
    Random r = new Random(2008);
    System.out.println(r.nextInt(3));
  }  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      test();
    }
  }
}

解决方案 »

  1.   

    r.netInt(3);里面的随机数和Random r = new Random(2008);也是有关系的
    具体啥关系,等待高人
      

  2.   

    new Random(2008)
    无论怎么next都是产生同样的伪随机数
      

  3.   

    public int nextInt(int n)
    返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。nextInt 的常规协定是伪随机地生成并返回指定范围中的一个 int 值。所有 n 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:
     public int nextInt(int n) {
         if (n<=0)
                    throw new IllegalArgumentException("n must be positive");     if ((n & -n) == n)  // i.e., n is a power of 2
             return (int)((n * (long)next(31)) >> 31);     int bits, val;
         do {
             bits = next(31);
             val = bits % n;
         } while(bits - val + (n-1) < 0);
         return val;
     }
     
    前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 int 值。但此算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。此算法特别对待 n 是 2 次幂的情况:它从基础的伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中有 short periods。因此,如果 n 是 2 次幂(幂值较小),则这种特殊情况会导致对此方法的后续调用会返回其长度大大增加的值序列。参数:
    n - 所返回随机数的范围。必须为正数。
    返回:
    一个伪随机数,处于 0(包括)和 n(包括)之间均匀分布的 int 值。
    抛出:
    IllegalArgumentException - n 不是正数。
      

  4.   

    Random
    public Random(long seed)使用单个 long 种子创建一个新随机数生成器: 
     public Random(long seed) { setSeed(seed); }next 方法使用它来保存随机数生成器的状态。 参数:
    seed - 初始种子。
    另请参见:
    setSeed(long)
    方法详细信息 setSeed
    public void setSeed(long seed)使用单个 long 种子设置此随机数生成器的种子。setSeed 的常规协定是它更改此随机数生成器对象的状态,使其状态好像是刚刚使用参数 seed 作为种子创建它的状态一样。Random 类按如下方式实现 setSeed 方法: 
    synchronized public void setSeed(long seed) {
           this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
           haveNextNextGaussian = false;
     }由 Random 类实现的 setSeed 恰好只使用 48 位的给定种子。但是,通常重写方法可能使用 long 参数的所有 64 位作为种子值。 注:尽管种子值是一个基本的 AtomicLong,但仍必须对此方法同步,确保 haveNextNextGaussian 的语义正确。 this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);好复杂的算法!
      

  5.   

    java编程思想第四版中有,r.nextInt()是指生成0与参数之间的一个值,不会发生变化。这个好像和数学的一个原理有关,忘记叫什么名字了,呵呵!
      

  6.   

    http://www.chinabs.net/webjava/default.asp?infoid=456
      

  7.   

    一样的种子,就会产生出一样的伪随机数此时就要根据相应的算法得到伪随机数
    如果没有种子,Rondom rd=new Rondom()则产生的随机数就是不断变化的
      

  8.   


    与 Random#nextInt(int) 方法采用的随机算法有关,算法在 API
    上有描述,但是为什么要这样做,呵呵,这得由数学理论来证明是
    有效可行的,这已经远远地超出了 Java 的范围,应该属于计算数
    学的范围了。
      

  9.   

    种子一样随机数肯定都是一样的,但为什么是1就去问开发java的人吧!
      

  10.   

    上面说的是有种子情况下的结果;
    如果没有种子:
    ----------------------------------------------------
    public class Test {    static void test() {        Random r = new Random();
            System.out.println(r.nextInt(3));
        }    public static void main(String[] args) {        for (int i = 0; i < 10; i++) {
                test();
            }
        }
    }
    ----------------------------------------------------
    打印出的结果就会不同了。
    因为没有种子的话,程序会取当前日期的XXX毫秒数(记不清了)来
    作为种子,所以每次执行种子都会不同,这些不同的种子对应3这个
    范围内的随机数(0或1或2)也就会不同。
    总之,种子和范围是相关联的。
    一个种子对应一个范围内的一个固定的随机数!
      

  11.   

    运行结果: 10个1
    原因: 在思索ing..........
      

  12.   

    为什么十个的都是相同的数字,那是因为它们使用了相同的种子. Random r = new Random(2008);为什么会产生相同的数.
    上面的朋友不是解释的很清楚.
    所以我们在产生产随机数时就
     Random r = new Random(System.currentTimeMillis());这样写了.===========================================
    不知道说的对不对.还请朋友们给予纠正.
      

  13.   

    Random r = new Random(need);need不同产生的数不同
    r.nextInt(n) n不同产生的数不同,
      

  14.   

    如果是:
    Random r = new Random(1);
        System.out.println(r.nextInt(3));
    那出的是:0
    如果是:
    Random r = new Random(2);
        System.out.println(r.nextInt(3));
    那出的是:1
    如果是:
    Random r = new Random(3);
        System.out.println(r.nextInt(3));
    那出的是:2
      

  15.   

    r.nextInt(3);把3换成别的数试一下,它就会改变了,但总是一个数
      

  16.   

    import java.util.Random;public class T {
      static void test() {
        Random r = new Random(2008);
        System.out.println(r.nextInt(3));
        System.out.println(r.nextInt(3));
        System.out.println(r.nextInt(3));
      }  public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
          test();
        }
      }
    }-------------------------------------------------------------
    import java.util.Random;public class T {
      static void test() {
        Random r = new Random(2008);
        System.out.println(r.nextInt(2008));
        System.out.println(r.nextInt(2008));
        System.out.println(r.nextInt(2008));
      }  public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
          test();
        }
      }
    }
      

  17.   


    你说的时候应该测试下 
    这样对你自己也有好处 
    `   你那样写产生出来的也是一样的`
    System.currentTimeMillis() 这个你把他打印出来就会发现得到的也是一个固定的值`
    应该是 不写 才对``
      

  18.   

    楼主已经给出答案了。java的随机数生成器生成的是伪随机数,而不是真正意义上的随机数。所谓伪随机数是一组可重复的随机数生成序列,在固定的种子,固定范围的情况下,会生成完全一样的随机数序列,如果种子是2008,Random r = new Random(2008)
    nextInt(3)
    则会产生以下的随机数序列:1
    2
    2
    1
    2
    0每次以2008为种子重新生成Random对象,第一个产生的随机数为1,无论调用多少次,产生的第一个伪随机数总是伪1. 而不设定种子的情况下,默认的构造器会以当前的系统时间为种子来构造随机数序列,所以每次生成的随机数序列也都是不同的。
      

  19.   


    n不同产生的数的范围不同 如果 你的n=1的话产生的数全部都为0,跟need就没有关系了
    这么理解对吗?