Java:存储随机种子以使用线程进行复制



对于我正在运行的模拟,我经常使用 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对象,而不是在所有线程之间共享一个对象。您可以将其作为参数传递,也可以在每个线程中创建它们。

附带说明一下,通常的做法是使用当前时间戳作为种子。如果需要重现伪随机序列,可以保存此值供以后使用。

最新更新