對於我正在運行的模擬,我使用了很多Java Random對象。因爲我希望能夠複製我的結果時,一些有趣的事情發生時我保存的隨機種子是這樣的:Java:存儲用線程再現的隨機種子
Random r = new Random();
Long seed = r.nextLong();
Random rand = new Random(seed);
這樣我可以節省種子並重新運行使用相同的種子仿真。然而,問題在於我也在使用線程:在模擬中,線程'a'可能首先調用rand.nextInt()並且線程'b'並且在模擬2線程'b'可能首先調用rand.nextInt()。我能以這樣的方式管理線程:線程總是以相同的順序調用一段代碼嗎?如果是這樣,那會不會讓這些線程變得多餘?
我想過在創建每個線程之前調用rand.nextInt(),然後將它作爲參數傳遞,但這在我的情況下不起作用:我也使用Collections.shuffle(List list,Random rand)和你可以傳遞一個Random對象作爲參數,但不是int本身。
將當前時間戳用作種子是很常見的做法。如果您需要重現僞隨機序列,您可以保存此值供以後使用。 –
您可以爲每個線程分配單獨的「Random」實例,每個實例都使用從核心種子生成的提供的種子。考慮使用'SplittableRandom',這是用於這種類型的並行化。 – shmosel
有一個類只是爲此 - https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html – pvg