我正在阅读 Richard Warburton 写的一本 Java 8 书籍,并且有一个关于并行流的随机数生成的问题。这是他提供的两次掷骰子模拟示例:
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
,并且由于我们并行处理流,执行该工作的一个线程对另一个线程产生的结果一无所知。因此,统计数据可能与使用随机
和同步
聚合的统计数据不同。
最佳答案
从随机生成的值序列应该是不相关的。
类似地,从 ThreadLocalRandom 生成的值序列应该与自身的值以及具有不同种子的任何其他 ThreadLocalRandom 的值不相关。
因此,切换到 ThreadLocalRandom
应该给出与使用 Random
具有相同统计数据的值。
优点是您无需进行任何同步。
关于java - ThreadlocalRandom 和 just Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606634/