我正在寫一個帶小數字段的類構造函數,需要用隨機值進行初始化。只需要一個小區域,我需要創建新的Random
對象。首先它看起來很麻煩,而在第二個時候,在一個時間片內創建大量對象時,會出現很多相等的值(new Random()
等於new Random(System.currentTimeMillis())
,並且等於timeMillis需要等於隨機值)。獲取隨機值而不創建「隨機」對象
避免這種情況的最佳方法是什麼?
我正在寫一個帶小數字段的類構造函數,需要用隨機值進行初始化。只需要一個小區域,我需要創建新的Random
對象。首先它看起來很麻煩,而在第二個時候,在一個時間片內創建大量對象時,會出現很多相等的值(new Random()
等於new Random(System.currentTimeMillis())
,並且等於timeMillis需要等於隨機值)。獲取隨機值而不創建「隨機」對象
避免這種情況的最佳方法是什麼?
新的隨機()是euqal新的隨機(System.currentTimeMillis的())
不,不是這樣的。在最近的JDK中,它是new Random(seedUniquifier()^System.nanoTime());
其中seedUniquifier()基於在靜態AtomicLong
上運行線性同餘生成器。因此,根據需要創建Random
對象實際上非常安全。
當然,你總是可以有一個private static Random
字段並在構造函數中使用它。
您正在查找Math.random。這是一種靜態方法,它在第一次調用對象時隱式初始化一個新對象,然後使用該對象。因此,您可以獲得在所有靜態字段初始化之間共享單個對象Random
的好處,而無需親自管理Random
對象。
儘管它沒有像「隨機」一樣令人愉快的API,但它有缺點。在單個靜態最終字段中沒有涉及很多「管理」...... – 2012-04-11 20:45:08
對於整數具有相同的方法會很棒。在此之前,我更喜歡在自己的課堂中使用** static **'Random'字段。 – Jofsey 2012-04-11 20:45:58
您使用的是Java 7,Random
是線程安全的,如記錄:
java.util.Random中的實例是線程安全的。但是,跨線程併發使用相同的java.util.Random實例可能會遇到爭用並導致性能下降。考慮在多線程設計中使用ThreadLocalRandom。
所以,你可以只使用:
private static final Random random = new Random();
...或使用ThreadLocalRandom
如果你要使用這個由許多線。這當然不會像SecureRandom
那樣隨機。基本上根據您的需要調整您的選擇。
我試着在DatagramSocket()中找到解決方案(它需要隨機套接字值),但沒有成功。 – Jofsey 2012-04-11 20:24:12
您使用的是什麼版本的Java? – 2012-04-11 20:25:01
我正在使用Java 7. – Jofsey 2012-04-11 20:40:33