2012-04-11 96 views
5

我正在寫一個帶小數字段的類構造函數,需要用隨機值進行初始化。只需要一個小區域,我需要創建新的Random對象。首先它看起來很麻煩,而在第二個時候,在一個時間片內創建大量對象時,會出現很多相等的值(new Random()等於new Random(System.currentTimeMillis()),並且等於timeMillis需要等於隨機值)。獲取隨機值而不創建「隨機」對象

避免這種情況的最佳方法是什麼?

+0

我試着在DatagramSocket()中找到解決方案(它需要隨機套接字值),但沒有成功。 – Jofsey 2012-04-11 20:24:12

+1

您使用的是什麼版本的Java? – 2012-04-11 20:25:01

+0

我正在使用Java 7. – Jofsey 2012-04-11 20:40:33

回答

9

新的隨機()是euqal新的隨機(System.currentTimeMillis的())

不,不是這樣的。在最近的JDK中,它是new Random(seedUniquifier()^System.nanoTime()); 其中seedUniquifier()基於在靜態AtomicLong上運行線性同餘生成器。因此,根據需要創建Random對象實際上非常安全。

當然,你總是可以有一個private static Random字段並在構造函數中使用它。

6

您正在查找Math.random。這是一種靜態方法,它在第一次調用對象時隱式初始化一個新對象,然後使用該對象。因此,您可以獲得在所有靜態字段初始化之間共享單個對象Random的好處,而無需親自管理Random對象。

+1

儘管它沒有像「隨機」一樣令人愉快的API,但它有缺點。在單個靜態最終字段中沒有涉及很多「管理」...... – 2012-04-11 20:45:08

+0

對於整數具有相同的方法會很棒。在此之前,我更喜歡在自己的課堂中使用** static **'Random'字段。 – Jofsey 2012-04-11 20:45:58

2

您使用的是Java 7,Random是線程安全的,如記錄:

java.util.Random中的實例是線程安全的。但是,跨線程併發使用相同的java.util.Random實例可能會遇到爭用並導致性能下降。考慮在多線程設計中使用ThreadLocalRandom。

所以,你可以使用:

private static final Random random = new Random(); 

...或使用ThreadLocalRandom如果你要使用這個由許多線。這當然不會像SecureRandom那樣隨機。基本上根據您的需要調整您的選擇。