【问题标题】:Random generator giving me the same number everytime随机生成器每次都给我相同的数字
【发布时间】:2012-12-16 07:53:40
【问题描述】:
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 个随机战士。现在有几行只是为了确认它不会产生随机数。

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

【问题讨论】:

    标签: java random


    【解决方案1】:

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

    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"Pseudorandom number generator"。这意味着它实际上不会生成随机数!相反,它以一种非常明确的方式计算它们 - 它们只是看起来像随机数,并且它们往往具有良好的分布。

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

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

    1 - 注意:这 不是来自 libc 的 rand() 的情况:“如果没有提供种子值,则 rand() 函数会自动使用值为 1。”

    【讨论】:

    • 谢谢,我以为种子会和当前时间一起使用。
    【解决方案2】:

    现在您正在使用相同的种子初始化随机数生成器。这将使它每次都产生相同的数字序列。你想使用no-arg constructor:

    Random gen = new Random();
    

    根据documentation

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

    【讨论】:

    • 哦,好吧,我还以为是种子将与当前时间一起使用。
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多