import java.util.Random;
public class Fighter {
int str;
int dex;
int hth;
Random gen = new Random(1535636);
public Fighter() {
str = gen.nextInt(9);
dex = gen.nextInt(9);
hth = gen.nextInt(14);
}
public int getHth(){
return hth;
}
public int getStr(){
return str;
}
public int getDex(){
return dex;
}
}
import java.util.Random;
public class Arena {
public static void main(String[] args) {
Random gen = new Random();
Fighter Guy1 = new Fighter();
int x =1;
while (x < 200000000){
x++;
}
Fighter Guy2 = new Fighter();
int hth1 = Guy1.getHth();
int hth2 = Guy2.getHth();
System.out.println("Fight Start");
System.out.println("---------------");
//System.out.println(gen.nextInt(10));
//System.out.println(gen.nextInt(17));
System.out.println(Guy1.getStr());
//Fighting
}
}
Run Code Online (Sandbox Code Playgroud)
每当我运行这个时,无论如何我都会得到相同的结果.我希望每次都能制作2个随机战士.现在有几行只是为了确认它不会产生随机数.
有谁知道如何在构造函数中正确使用随机数?或者我这样做完全错了?
Jon*_*art 12
您为随机数生成器提供了一个常量种子值:
Random gen = new Random(1535636);
Run Code Online (Sandbox Code Playgroud)
不要那样做.它将始终提供相同的值.只需调用默认构造函数:
Random gen = new Random();
Run Code Online (Sandbox Code Playgroud)
那
创建一个新的随机数生成器.其种子初始化为基于当前时间的值:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#Random()
为什么?
与大多数"标准库"随机数生成器一样,Random是"伪随机数生成器".这意味着它实际上并没有生成随机数!相反,它是以一种非常明确的方式计算它们 - 它们看起来像随机数,并且它们往往具有良好的分布.
使用种子值初始化PRNG,该种子值设置其内部状态.如果每次都提供相同的种子值,PRNG将在每次运行时处于相同状态,从而提供相同的数字序列!
这使得他们看起来随机的时候,问题是,通常1它们是"播种"在默认情况下使用基于时间的价值.在大多数库中,这是一个具有非常精确的时间值.所以大多数时候,如果你看到有人播种他们的PRNG,那可能是不正确的,或者至少是非常不必要的.
1 - 注意:libc 不是这种情况rand():"如果没有提供种子值,则rand()函数会自动播种,值为1."