4
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



}



}

每当我运行它时,无论如何我都会得到相同的结果。我希望它每次都能制作 2 个随机战士。现在有几行只是为了确认它不会产生随机数。

有谁知道如何在构造函数中正确使用随机数?还是我这样做完全错了?

4

2 回答 2

12

您正在为随机数生成器提供一个恒定的种子值:

Random gen = new Random(1535636);  

不要那样做。它将始终提供相同的值。只需调用默认构造函数:

Random gen = new Random();

创建一个新的随机数生成器。它的种子根据当前时间初始化为一个值:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#Random()


为什么?

与大多数“标准库”随机数生成器一样,Random“伪随机数生成器”。这意味着它实际上并没有生成随机数!相反,它以一种非常明确的方式计算它们——它们看起来就像随机数,而且它们往往有一个不错的分布。

PRNG 使用设置其内部状态的种子值进行初始化。如果您每次都提供相同的种子值,那么每次运行 PRNG 都会处于相同的状态,因此提供相同的数字序列!

使它们一直看起来随机的事情是,通常1默认情况下它们是“播种”的,具有基于时间的值。在大多数库中,这是一个非常精确的时间导出值。所以大多数时候,如果你看到有人播种他们的 PRNG,那可能是不正确的,或者至少是非常不必要的。

1 - 注意:来自 libc的情况并非如此: “如果未提供种子值,则 rand() 函数将自动以值 1 为种子。”rand()

于 2012-12-16T07:57:15.477 回答
4

现在,您正在使用相同的种子初始化随机数生成器。这将使它每次都产生相同的数字序列。您想使用无参数构造函数

Random gen = new Random();

根据文档

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

于 2012-12-16T07:57:36.750 回答