我想用random随机生成10个0.0-1.0的数字,每次重新生成的这10个数都是固定的,我尝试用添加种子的方法生成
for (int i = 0; i < 10; i++) {
Random rdm = new Random(1);
float num= rdm.nextFloat();
System.out.println(num);
}
结果这10个数字是一样的`我知道我的结果是错的,求正确的解决思路,谢谢

解决方案 »

  1.   

    Random rdm = new Random();
    这样就可以了
      

  2.   

    Random rdm = new Random(1); 放在循环前面去
      

  3.   

    for (int i = 0; i < 10; i++) {
    Random rdm = new Random();
    float num= rdm.nextFloat();
    System.out.println(num);
    }
    去掉你设置的种子
      

  4.   

    另外,指定种子,就一定会生成固定结果,这是伪随机数的特色,不过也为重演带来了方便。如果不希望固定结果,就别指定种子,类似:        Random rdm = new Random();
            for (int i = 0; i < 10; i++) {
                float num = rdm.nextFloat();
                System.out.println(num);
            }
    其实也就是:
    public Random() { this(++seedUniquifier + System.nanoTime()); }
      

  5.   

    OK,问题解决了,但是我就是不理解,为什么放到外面就可以了,在循环中用到的不是还是带有同样种子的random对象吗?为什么每次生成的随机数就不一样了
      

  6.   

    搂住 java里的random设置相同的seed 获得的是同一个随机数队列,你每次都是从相同的随机数队列里面拿出来第一个数 当然相同了 ,random的默认构造函数random(),才用的种子是当时系统的毫秒值,System.currentTimeMillis(), 所以每次生成的数会不一样,前提是你每次都要new random()使其产生新的随机数队列,你上面的代码只要把seed去掉即可.
      

  7.   

     "你每次都是从相同的随机数队列里面拿出来第一个数"你的意思是random每次都产生一个随机数队列吗?照你这个意思是不是还能从队列拿出第二个,第三个...的数? 
      

  8.   

    Random并不是包含一个随机数队列,只是说你设置了种子之后,每次next产生的随机数序列相同。
      

  9.   

    可以理解为伪随机数是一个很大很大的循环数组,而seed就相当于指定了这个数组的下标,然后每次取值就是 nextXXXX,也就是在数组里面不断的取出下一个下标的数值。所以seed相同的情况下,后续取出值的也会持续相同。
      

  10.   

    Random rdm = new Random(1);
    里面那个1是作为种子,然后生成随机数时是根据这个种子来执行一种产生随机数算法,因为你for循环里每次都是使用1作为种子,所以每次产生的随机数都一样。
    Random rdm = new Random();
    是使用系统当前时间作为种子,因为每次执行时时间不同,种子不同产生的随机数也就不一样了。