我正在阅读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
,由于我们并行处理一个流,因此该线程对另一线程产生的结果一无所知。因此,该统计信息可能与通过Random
和synchronization
进行汇总的统计信息有所不同。 最佳答案
从随机数生成的值的序列应不相关。
同样,从ThreadLocalRandom生成的值的序列应与自身的值以及与其他具有不同种子的ThreadLocalRandom的值不相关。
因此,切换到ThreadLocalRandom
应该为值提供与使用Random
相同的统计信息。
优点是您避免了任何同步需求。