2014-12-02 196 views
2

我希望每個處理的對象都有5個隨機數。我處理許多對象(分開),並且需要確保在所有數字中都實現了隨機性。如果我處理5個對象,我將有25支隨機數:正確生成隨機數

  RN1 RN2 RN3 RN4 RN5 
Object 1 1 2 3 4 5 
Object 2 6 7 8 9 10 
Object 3 11 12 13 14 15 
Object 4 16 17 18 19 20 
Object 5 21 22 23 24 25 

的問題是:

  • 爲單個對象,是否有所作爲,如果我使用目前每單號創建隨機數發生器時間以毫秒爲種子,或者當我創建一個隨機數生成器並根據隨機性質量使用nextDouble獲得一系列數字?
  • 一旦我處理了多個對象,並且我將所有對象的所有第一個隨機數取回,這些會形成均勻的隨機分佈(例如數字1,6,11,16,21)還是會以某種方式被破壞?

我的觀點是,這將是最好創建一個隨機數生成器只(所有對象共享),這樣當需要新的隨機電話號碼我可以nextDouble()和隨機數序列得到一個數字。

回答

3

查看來自Java的ThreadLocalRandom類。

它提供了均勻分佈並避免了瓶頸,因爲每個線程都有自己的副本。

關於他們有不同的序列,這都是關於改變他們的種子。這種情況下的一種常見做法是使用線程/任務/進程的標識符來查看生成器。

+0

如果您想要了解更多關於如何處理Java中並行/併發應用程序中的隨機數的細節,我寫了一篇關於這方面的文章:http://onlinelibrary.wiley.com/doi/10.1002/cpe.3214/abstract – jopasserat 2014-12-02 15:17:47

+0

同一篇論文的免費版本:https://hal.inria.fr/hal-01098598v1 – jopasserat 2015-01-28 14:56:24

1

•對於單個對象,是否有所作爲,如果我使用當前時間 毫秒的種子每一個號碼創建隨機 數發生器或當我創建一個隨機數生成器和 得到一系列的數字使用nextDouble在隨機性質量方面?

不要將當前時間用作每個數字的種子。生成時間比以毫秒爲單位的當前時間的分辨率更少。

+0

使用單個生成器是一種非常糟糕的做法,因爲如果應用程序擴展,它不僅會成爲瓶頸,而且也不能確保結果是可重複的,因爲您無法預測線程訪問的順序發電機。它取決於操作系統的調度策略 – jopasserat 2014-12-02 15:14:13

+0

@jopasserat編輯強調我真正想要做的點,即不要將當前時間用作每次調用的種子。 – kutschkem 2014-12-02 15:16:35

+0

這一點值得一提。儘管我們不知道OP是否期望可重複性。對於一款遊戲,它可能會很好。 – jopasserat 2014-12-02 15:19:03

1

最安全的方法可能是初步生成所需數量的隨機數,將其保存到數組中,並建立訪問順序規則。通過這種方式,您可以完全控制流程。也沒有「失去隨機性」。否則,如果您一次啓動多個生成器,它們很可能會被植入相同的值(默認爲系統時間),並且如果使用由不同線程同時訪問的單個生成器,則需要傳遞一個對象Random類,這可能是好的,但也可能導致重現性的損失(我不確定,如果這對您的情況至關重要)。