2017-05-18 65 views
2

對於我正在運行的模擬,我使用了很多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本身。

+0

將當前時間戳用作種子是很常見的做法。如果您需要重現僞隨機序列,您可以保存此值供以後使用。 –

+1

您可以爲每個線程分配單獨的「Random」實例,每個實例都使用從核心種子生成的提供的種子。考慮使用'SplittableRandom',這是用於這種類型的並行化。 – shmosel

+2

有一個類只是爲此 - https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html – pvg

回答

-1

每個線程應該有自己的Random對象,而不是在所有線程之間共享一個對象。您可以將其作爲參數傳遞,也可以在每個線程中創建它們。

在附註上,通常使用當前時間戳作爲種子。如果您需要重現僞隨機序列,您可以保存此值供以後使用。

+0

謝謝,不知道使用當前的時間戳!將來會這樣做。我應該保存線程的隨機對象的所有種子來重現嗎?有點希望能拯救一顆種子。 – Fringo

+0

@Fringo查看您的問題的其他評論,特別是ThreadLocalRandom的鏈接。 –