我正在阅读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
功能。后来他给出了 sketch :
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
汇总的统计信息不同。
答案 0 :(得分:4)
从Random生成的值序列应该是不相关的。
类似地,从ThreadLocalRandom生成的值序列应与来自其自身的值以及来自具有不同种子的任何其他ThreadLocalRandom的值不相关。
因此,切换到ThreadLocalRandom
时,应使用与使用Random
相同的统计信息给出值。
优点是您可以避免同步。