【发布时间】:2017-10-17 14:42:54
【问题描述】:
对于我正在运行的模拟,我经常使用 Java Random 对象。因为我希望能够在发生有趣的事情时重现我的结果,所以我像这样保存随机种子:
Random r = new Random();
Long seed = r.nextLong();
Random rand = new Random(seed);
这样我可以保存种子并使用相同的种子重新运行模拟。然而,问题是我也在使用线程:在模拟 1 中,线程“a”可能首先调用 rand.nextInt(),然后线程“b”,在模拟 2 中,线程“b”可能首先调用 rand.nextInt()。我能否以线程始终以相同顺序调用一段代码的方式管理线程?如果是这样,那不会使线程变得多余吗?
我考虑过在创建每个线程之前调用 rand.nextInt() 然后将其作为参数传递,但这在我的情况下不起作用:我也使用 Collections.shuffle(List list, Random rand) 你可以传递一个 Random 对象作为参数,但不是 int 本身。
【问题讨论】:
-
通常的做法是使用当前时间戳作为种子。如果需要重现伪随机序列,可以保存此值以备后用。
-
您可以为每个线程分配单独的
Random实例,每个实例都有一个从核心种子生成的种子。考虑使用SplittableRandom,它适用于这种类型的并行化。 -
有一个专门为此而设的课程 - docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
标签: java multithreading random