簡體   English   中英

正確生成隨機數

[英]Generate random numbers correctly

我想為我處理的每個對象使用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()並按隨機數序列獲取下一個數。

看看Java中的ThreadLocalRandom類。

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

關於它們具有不同的順序,這全都在於改變它們的種子。 在這種情況下,一種常見的做法是查看帶有線程/任務/進程標識符的生成器。

•對於單個對象,如果我使用當前時間(以毫秒為單位)為每個數字創建一個隨機數生成器,或者當我創建一個隨機數生成器並使用nextDouble就隨機性質量獲得一系列數字時,這會有所不同嗎?

不要將當前時間用作每個數字的種子。 生成所花費的時間少於當前時間的分辨率(以毫秒為單位)。

最安全的方法可能是預先生成所需數量的隨機數,將其保存到數組中,並建立訪問順序規則。 這樣,您可以完全控制該過程。 也沒有“隨機性損失”。

否則,如果一次啟動多個生成器,則它們很可能會使用相同的值(默認情況下為系統時間)作為種子,並且如果使用由不同線程同時訪問的單個生成器,則需要傳遞一個Random類的對象,可能很好,但也可能導致可重復性的損失(我不確定,如果這對您而言至關重要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM