Java随机数不是随机数吗?
我试图用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
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];