[英]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
在隨機性方面獲得一系列數字,這會有所不同嗎? 我的觀點是,最好僅創建一個隨機數生成器(由所有對象共享),以便每當需要新的隨機數時,我都可以調用nextDouble()
並按隨機數序列獲取下一個數。
看看Java中的ThreadLocalRandom
類。
它提供了均勻的分布並避免了瓶頸,因為每個線程都有自己的副本。
關於它們具有不同的順序,這全都在於改變它們的種子。 在這種情況下,一種常見的做法是查看帶有線程/任務/進程標識符的生成器。
•對於單個對象,如果我使用當前時間(以毫秒為單位)為每個數字創建一個隨機數生成器,或者當我創建一個隨機數生成器並使用nextDouble就隨機性質量獲得一系列數字時,這會有所不同嗎?
不要將當前時間用作每個數字的種子。 生成所花費的時間少於當前時間的分辨率(以毫秒為單位)。
最安全的方法可能是預先生成所需數量的隨機數,將其保存到數組中,並建立訪問順序規則。 這樣,您可以完全控制該過程。 也沒有“隨機性損失”。
否則,如果一次啟動多個生成器,則它們很可能會使用相同的值(默認情況下為系統時間)作為種子,並且如果使用由不同線程同時訪問的單個生成器,則需要傳遞一個Random
類的對象,可能很好,但也可能導致可重復性的損失(我不確定,如果這對您而言至關重要)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.