Я читаю книгу Java 8 Ричарда Уорбертона и задаюсь вопросом о генерации случайных чисел для параллельных потоков. Вот пример моделирования два-кубика броска он обеспечил:ThreadlocalRandom and just Random
public Map<Integer, Double> parallelDiceRolls(){
double fraction = 1.0/N;
return IntStream.range(0, N)
.parallel()
.mapToObj(twoDiceThrows())
.collect(groupingby(side -> side,
summingDouble(n -> fracton));
Мой вопрос о функции twoDiceThrow
. Позже он дает свой эскиз:
private int twoDiceThrow(ThreadLocalRandom random){
int firstThrow = random.nextInt(1, 7);
int secindThrow = random.nextInt(1, 7);
return firstThrow + secondThrow;
}
речь здесь идет о ThreadLocalRandom
. Не больно ли статистика? Я имею в виду, что ThreadLocalRandom
ограничивается Thread
, и поскольку мы обрабатываем наш поток параллельно, одна нить, выполняющая работу, ничего не знает о результатах, полученных другим. Поэтому статистика может отличаться от статистики, которая будет агрегирована с Random
и synchronization
.
Статистика будет также отличаться при запуске кода несколько раз. Это точка генератора чисел * Random *. Было бы важно, если бы вы предоставляли фиксированное семя генератору псевдослучайных чисел. –
* Вопрос здесь *, как вы ожидаете, что код будет скомпилирован? 'mapToObj (twoDiceThrows())' не будет компилироваться, потому что 'mapToObj()' ожидает 'IntFunction', т. е. метод с параметром' int', а 'twoDiceThrows()' не возвращает такую 'IntFunction'. Возможно, это не означало как метод * call *, но метод * reference *, то есть без скобки, но это все равно не сработало, потому что метод не принимает параметр 'int'. – Andreas
@Andreas Возможно, 'twoDiceThrows' и' twoDiceThrow' - это два разных метода ... (первый не показан здесь)? Но, возможно, это простая опечатка, и ваш комментарий действителен ... – Seelenvirtuose