2016-06-03 4 views
0

Я читаю книгу 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.

+4

Статистика будет также отличаться при запуске кода несколько раз. Это точка генератора чисел * Random *. Было бы важно, если бы вы предоставляли фиксированное семя генератору псевдослучайных чисел. –

+2

* Вопрос здесь *, как вы ожидаете, что код будет скомпилирован? 'mapToObj (twoDiceThrows())' не будет компилироваться, потому что 'mapToObj()' ожидает 'IntFunction', т. е. метод с параметром' int', а 'twoDiceThrows()' не возвращает такую ​​'IntFunction'. Возможно, это не означало как метод * call *, но метод * reference *, то есть без скобки, но это все равно не сработало, потому что метод не принимает параметр 'int'. – Andreas

+0

@Andreas Возможно, 'twoDiceThrows' и' twoDiceThrow' - это два разных метода ... (первый не показан здесь)? Но, возможно, это простая опечатка, и ваш комментарий действителен ... – Seelenvirtuose

ответ

4

Последовательность значений, генерируемых случайным образом, должна быть некоррелирована.

Аналогично, последовательность значений, генерируемых в ThreadLocalRandom, должна быть некоррелирована со значениями из себя и значениями из любого другого ThreadLocalRandom с другим семенем.

Таким образом, переключение на ThreadLocalRandom должно давать значения с той же статистикой, что и с использованием Random.

Преимущество в том, что вы не нуждаетесь в синхронизации.

+0

Значит, «степень случайности» - то же самое, не так ли? Означает ли это, что в «ThreadLocalRandom» предпочтительный выбор с момента его появления? – Alupkers

Смежные вопросы