2011-08-21 15 views
10

私はJava 7のThreadLocalRandomを試していて、複数のスレッドにわたって正確に同じ乱数を生成していることを確認しています。ここでJava 7:同じ乱数を生成するThreadLocalRandom

は、私は5つの乱数うち5つのスレッド、各スレッドのプリントを作成している私のコードです:

//5 threads 
for(int i = 0; i < 5 ; i++) { 
    final Thread thread = new Thread() { 
     @Override 
     public void run() { 
      System.out.print(Thread.currentThread().getName()+":"); 

      //each thread prints 5 random numbers 
      for(int j = 0 ; j < 5; j++) { 
       final int random = ThreadLocalRandom.current().nextInt(1,100); 
       System.out.print(random + ","); 
      } 
      System.out.println(); 
     } 
    }; 
    thread.start(); 
    thread.join(); 
} 

出力:

Thread-0:1,93,45,75,29, 
Thread-1:1,93,45,75,29, 
Thread-2:1,93,45,75,29, 
Thread-3:1,93,45,75,29, 
Thread-4:1,93,45,75,29, 

は、なぜ私はそれぞれに同じ乱数を取得していますスレッドとプログラムの実行ごとに?

答えて

10

この問題に関するオープンなバグがあるようです。私http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

それのショート/ロングを与えherehere

+0

+1気の利いたバグは – Matt

+2

です。このバグはJDK7のアップデート2で解決されました。ここでダウンロードしてください:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html – jopasserat

1

これは、スレッドがほぼ同時に作成され、タイマーから同じ値がシードされるためですか?私は間違っているかもしれませんが、それがうまくいかなかったという印象を受けました。

+0

を使用することはできませんしない、大きなドキュメントから期待される動作が存在しない、すなわちそのコンストラクタがないもつとも時差 - 各スレッドは、前のスレッドが終了した後にのみ作成されます。 – MByD

5

は「ThreadLocalRandomソース」のためにグーグルを参照してください:それは、引数なしのコンストラクタた構成

ために引数なしのコンストラクタを呼び出すThreadLocal<ThreadLocalRandom>を使用しています

/** 
* Constructor called only by localRandom.initialValue. 
* We rely on the fact that the superclass no-arg constructor 
* invokes setSeed exactly once to initialize. 
*/ 
ThreadLocalRandom() { 
    super(); 
} 

あるユニークな種子

0と Random呼び出し、この(長い)で引数なしのスーパー

public Random(long seed) { 
    this.seed = new AtomicLong(initialScramble(seed)); 
} 

とThreadLocalRandomは/それは同じ時間ではありませんプライベートseed

+1

これはJDKのソースではありません( 'eclipse'と' scala'のヒントがURL)。実際のJDKのソースはhttp://hg.openjdk.java.netにあり、ここには['ThreadLocalRandom'](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/)があります。共有/クラス/ java/util/concurrent/ThreadLocalRandom.java) – dimo414