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,
Почему я получаю одинаковые случайные числа для каждого потока и для каждого выполнения программы?
Ответы
Ответ 2
googling для "источника ThreadLocalRandom" дал мне http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
long/short it: он использует ThreadLocal<ThreadLocalRandom>
, который вызывает конструктор no-arg для построения
что конструктор no-arg
/**
* 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();
}
no-arg super в Random называет это (длинным) уникальным семенем
ОДНАКО, что конструктор делает
public Random(long seed) {
this.seed = new AtomicLong(initialScramble(seed));
}
то есть. не ожидаемое поведение из документации
и ThreadLocalRandom не использует/не может использовать закрытый seed
Ответ 3
Разве это не потому, что потоки создаются примерно в одно и то же время и, таким образом, высевают одно и то же значение из таймера? У меня создалось впечатление, что это сработало, хотя я и ошибаюсь.