Java随机数不是随机的吗?
问题描述:
我试图用一个朋友在Java中解释随机数发生器,当他每次运行该程序时都会得到相同的数字。我创建了自己的更简单的版本,并且每次运行该程序时都会得到相同的确切数字。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
答
您已经播种,随机数生成具有恒定值100
。它是确定性的,所以每次运行都会产生相同的值。
我不知道你为什么选择与100
种子,但种子值无关,与被产生的(这是通过其他方式来控制,比如调用nextInt
值的范围内,你已经有)。
要每次获得不同的值,请使用不带参数的构造函数Random
,该函数使用系统时间为随机生成器播种。
从的Javadoc报价为参数的构造函数Random
:
创建一个新的随机数发生器。此构造函数将随机数生成器的种子 设置为非常可能与此构造函数的任何其他调用不同的值 。
引用的实际代码的参数的构造函数Random
:
public Random() {
this(seedUniquifier()^System.nanoTime());
}
答
此:
Random rand = new Random(100);
你给随机数生成相同的种子(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];
,我认为是更好的方式使用的Math.random()。 – Gere 2013-04-29 23:48:51
你在创建你的Random实例时使用了一个常数种子。所以当然你会得到相同的数字。 – 2013-04-29 23:51:22
@Gere:'Math.random()'有什么神奇之处,为什么它比使用Random实例更好? – 2013-04-29 23:51:59