【问题标题】:Java: Storing random seed for reproducing with threadsJava:存储随机种子以使用线程进行复制
【发布时间】: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


【解决方案1】:

每个线程都应该有自己的Random 对象,而不是在所有线程之间共享一个。您可以将其作为参数传递,也可以在每个线程中创建它们。

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

【讨论】:

  • 谢谢,不知道使用当前时间戳!将来会这样做。然后我应该保存线程的随机对象的所有种子以进行复制吗?有点希望拯救一颗种子是可能的。
  • @Fringo 查看您的问题的其他 cmets,尤其是 ThreadLocalRandom 的链接。
猜你喜欢
  • 2016-08-12
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2020-04-07
相关资源
最近更新 更多