我正在阅读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,由于我们并行处理一个流,因此该线程对另一线程产生的结果一无所知。因此,该统计信息可能与通​​过Randomsynchronization进行汇总的统计信息有所不同。

最佳答案

从随机数生成的值的序列应不相关。

同样,从ThreadLocalRandom生成的值的序列应与自身的值以及与其他具有不同种子的ThreadLocalRandom的值不相关。

因此,切换到ThreadLocalRandom应该为值提供与使用Random相同的统计信息。

优点是您避免了任何同步需求。

07-24 09:18