对于我正在运行的模拟,我正在使用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本身。
答案 0 :(得分:-1)
每个线程都应该有自己的Random
对象,而不是在所有线程之间共享一个。您可以将其作为参数传递,也可以在每个线程中创建它们。
另一方面,通常的做法是使用当前时间戳作为种子。如果需要重现伪随机序列,可以保存此值以供以后使用。