9

我试图向一位朋友解释 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

4 回答 4

23

您已经为随机生成器播种了一个常数值100。它是确定性的,因此每次运行都会生成相同的值。

我不确定您为什么选择使用 来播种100,但种子值与生成的值的范围无关(由其他方式控制,例如nextInt您已经拥有的调用)。

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

引用 Javadoc 的无参数Random构造函数:

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

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

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
于 2013-04-29T23:45:57.280 回答
2

这个:

   Random rand = new Random(100);

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

于 2013-04-29T23:46:45.317 回答
1

希望这可以帮助..

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];
于 2014-07-19T17:29:36.543 回答
1

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

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

于 2013-04-29T23:47:31.077 回答