gpt4 book ai didi

java - 每个线程一个 Random 实例,由原始 Random 实例播种以获得可重复性

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:58 26 4
gpt4 key购买 nike

我需要进行 1000 计算,每一次都基于一个随机数。整个运行需要可重现

在单线程环境中,我只是根据种子创建随机数并将其用于每次计算:

Random random = new Random(37);
for (Calculation c : calculations) {
c.doCalculation(r.nextInt());
}

在多线程环境中,我有 10 个线程,我有一个种子随机种子线程 Random 的:

Random initRandom = new Random(37);
for (List<Calculation> p : calculationPartitions) {
final Random threadRandom = new Random(initRandom.nextLong());
executorService.submit(() -> {
for (Calculation c : p) {
c.doCalculation(threadRandom.nextInt());
}
});
}
// Merge the calculation results back in the same order as the calculationPartitions
...

这是个好主意吗?总体上它仍然是均匀分布的随机数吗?每个 threadRandom 都由 initRandom 播种,这不会破坏均匀分布吗?

出于可重现的原因,我无法共享 1 个全局随机数,因为某些线程在某些运行中可能比其他线程运行得更快,因此它们不会总是以相同的顺序调用全局随机数(争用可能会导致性能下降)。

最佳答案

您将通过 Random 获得均匀分布的数字,但是无法保证列表中每个计算对象列表的运行顺序,因此如果这些然后将结果传递到共享列表,则顺序可能会随着运行而变化。

关于java - 每个线程一个 Random 实例,由原始 Random 实例播种以获得可重复性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39253931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com