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-注:これは、 from libcの場合には当てはまりません。 「シード値が指定されていない場合、rand()関数には値1が自動的にシードされます。」rand()

于 2012-12-16T07:57:15.477 に答える
4

現在、同じシードを使用して乱数ジェネレーターを初期化しています。これにより、毎回同じ数列が生成されます。引数なしのコンストラクターを使用したい:

Random gen = new Random();

ドキュメントによると

このコンストラクターは、乱数ジェネレーターのシードを、このコンストラクターの他の呼び出しとは異なる可能性が非常に高い値に設定します。

于 2012-12-16T07:57:36.750 に答える