2013-04-29 14 views
7

私は、Javaで乱数ジェネレータを説明していましたが、彼はプログラムを実行するたびに同じ数字を得ていました。私は同じものを自分の簡単なバージョンを作成し、私も彼がプログラムを実行するたびに得ていた同じ正確な数字を取得しています。Java乱数はランダムではありませんか?

私は間違っていますか? 100のうち

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); 
    } 

} 

最後の5の数字は以下のとおりです。

40 
60 
27 
56 
53 
+1

I)は、より良い方法を使用Math.random(だと思います。 – Gere

+6

ランダムインスタンスを作成するときに定数シードを使用しています。もちろん、あなたは同じ数字を得るでしょう。 –

+3

@Gere: 'Math.random()'についてとても魔法で、なぜRandomインスタンスを使うよりもいいのですか? –

答えて

23

あなたが一定の値100と乱数発生器を接種しています。これは決定論的なので、実行するたびに同じ値が生成されます。

あなたは100でそれをシードすることを選んだ理由は、私はわからないんだけど、シード値は、そのすでにnextIntへの呼び出しとして生成された値の範囲とは何の関係も(それは他の手段によって制御されますが、持っていません持ってる)。

毎回異なる値を取得するには、引数なしのRandomコンストラクタを使用します。このコンストラクタは、システムジェネレータをシードするためにシステム時間を使用します。パラメータなしRandomコンストラクタのJavadocから引用

は新しい乱数ジェネレータを作成します。このコンストラクタは、乱数ジェネレータのシード を、このコンストラクタの他の呼び出しから区別できる可能性が高い値の に設定します。パラメータなしRandomコンストラクタで実際のコードを引用

public Random() { 
    this(seedUniquifier()^System.nanoTime()); 
} 
2

この:あなたは乱数ジェネレータに同じシード(100)あなたが起動するたびに与えている

Random rand = new Random(100); 

プログラム。 System.currentTimeMillis()からの出力のようなものを与えてください。それは、呼び出しごとに異なる番号を与えるはずです。

1

乱数ジェネレータは、実際には疑似ランダムです。すなわち、決定論的手段を使用して、特定の統計的基準が与えられるとランダムに現れるシーケンスを生成する。

Random(long seed) constuctorを使用すると、擬似乱数のシーケンスを決定するシードを渡すことができます。

0

・ホープ、このことができます。..

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]; 
関連する問題