Java随机数不是随机数吗?

Java随机数不是随机数吗?,java,random,Java,Random,我试图用Java向一位朋友解释随机数生成器,但他每次运行程序时都会得到相同的数字。我创建了我自己的同一个东西的简单版本,我也得到了他每次运行程序时得到的相同的精确数字 我做错了什么 import java.util.*; public class TestCode{ public static void main(String[] args){ int sum = 0; Random rand = new Random(100); for(int

我试图用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
。它是确定性的,因此每次运行都会生成相同的值

我不确定您为什么选择使用
100
对其进行种子设定,但种子设定值与生成的值范围无关(这是由其他方式控制的,例如调用您已有的
nextInt

要每次获得不同的值,请使用不带参数的构造函数,该构造函数使用系统时间为随机生成器种子

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

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
创建一个新的随机数生成器。此构造函数设置种子 将随机数生成器的 从该构造函数的任何其他调用

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

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
这:


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

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

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

希望这有帮助

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];
Random r=新随机(System.currentTimeMillis());
double[]兰德=新的double[500];

对于(int i=0;我认为使用Math.random()是更好的方法。在创建随机实例时,您使用的是一个常量种子。因此,您当然会得到相同的数字。@GEER:Math.random()有什么神奇之处?为什么它比使用随机实例更好?在这种情况下,使用int num=(int)(Math.random()*100)“任何一个考虑产生随机数字的算术方法的人,当然都处于罪恶的状态”——约翰·冯·诺依曼
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];