黑马程序员技术交流社区

标题: java Random类 求解 [打印本页]

作者: 张甲甲    时间: 2013-5-26 19:36
标题: java Random类 求解
本帖最后由 张甲甲 于 2013-5-27 10:04 编辑

Random类的setSeed(seed)方法什么意思,种子是什么意思啊。
是不是种子不一样随机出来的数就不一样啊

我想写如下一个问题:获取5个1至10的随机数,要求随机数不能重复。
我写的程序如下:
public class Test{
        public static void main(String[] args) {
                int a[]=new int[19];
                Random random=new Random();
                for (int i = 0; i < a.length; i++) {
                        
                        random.setSeed(i);
                        a=random.nextInt(20);
                }
        for (int i = 0; i < a.length; i++) {
                System.out.print(a+" ");
        }
               
        }
        
        
}

为什么随机出来的数字 有重复的啊
真心求解


作者: xiewen    时间: 2013-5-27 01:14
我查了下文档,文档是这样写的:
setSeed 的常规协定是它更改此随机数生成器对象的状态,使其状态好像是刚刚使用参数 seed 作为种子创建它的状态一样。通过将种子自动更新为
(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)并清除 nextGaussian() 使用的 haveNextNextGaussian 标志,Random 类可实现 setSeed 方法。
Random 类实现的 setSeed 恰好只使用 48 位的给定种子。但是,通常重写方法可能使用 long 参数的所有 64 位作为种子值。
如果这个类的两个实例使用同一个种子创建,对它们以同样的顺序调用方法,则它们会产生相同的数字序列。
下面就对上面的介绍做一个实验,可以看到但使用两个Random对象种子相同时,它们会产生相同的数字序列:
  1. public class SeedTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Random r1 = new Random(50);
  6.                 System.out.println("第一个种子为50的Random对象");
  7.                 System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
  8.                 System.out.println("r1.nextInt():\t\t" + r1.nextInt());
  9.                 System.out.println("r1.nextDouble():\t" + r1.nextDouble());
  10.                 System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());
  11.                 System.out.println("---------------------------");        
  12.                 Random r2 = new Random(50);
  13.                 System.out.println("第二个种子为50的Random对象");
  14.                 System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
  15.                 System.out.println("r2.nextInt():\t\t" + r2.nextInt());
  16.                 System.out.println("r2.nextDouble():\t" + r2.nextDouble());
  17.                 System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());
  18.                 System.out.println("---------------------------");        
  19.                 Random r3 = new Random(100);
  20.                 System.out.println("种子为100的Random对象");
  21.                 System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());
  22.                 System.out.println("r3.nextInt():\t\t" + r3.nextInt());
  23.                 System.out.println("r3.nextDouble():\t" + r3.nextDouble());
  24.                 System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());        
  25.         }
  26. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2