随機數在太多的地方使用了,比如加密、混淆資料等,我們使用随機數是期望獲得一個唯一的、不可仿造的數字,以避免産生相同的業務資料造成混亂。在Java項目中通常是通過Math.random方法和Random類來獲得随機數的,我們來看一段代碼:


代碼很簡單,我們一般都是這樣獲得随機數的,運作此程式可知:三次列印的随機數都不相同,即使多次運作結果也不同,這也正是我們想要随機數的原因。我們再來看下面的程式:


上面使用了Random的有參構造,運作結果如下:
計算機不同輸出的随機數也不同,但是有一點是相同的:在同一台機器上,甭管運作多少次,所列印的随機數都是相同的,也就是說第一次運作,會列印出這三個随機數,第二次運作還是列印出這三個随機數,隻要是在同一台硬體機器上,就永遠都會列印出相同的随機數,似乎随機數不随機了,問題何在?
那是因為産生随機數的種子被固定了,在Java中,随機數的産生取決于種子,随機數和種子之間的關系遵從以下兩個規則:
種子不同,産生不同的随機數。
種子相同,即使執行個體不同也産生相同的随機數。
看完上面兩個規則,我們再來看這個例子,會發現問題就出在有參構造上,Random類的預設種子(無參構造)是System.nanoTime()的傳回值(JDK 1.5版本以前預設種子是System. currentTimeMillis()的傳回值),注意這個值是距離某一個固定時間點的納秒數,不同的作業系統和硬體有不同的固定時間點,也就是說不同的作業系統其納秒值是不同的,而同一個作業系統納秒值也會不同,随機數自然也就不同了。(順便說下,System.nanoTime不能用于計算日期,那是因為“固定”的時間點是不确定的,納秒值甚至可能是負值,這點與System. currentTimeMillis不同。)
new Random(1000)顯式地設定了随機種子為1000,運作多次,雖然執行個體不同,但都會獲得相同的三個随機數。是以,除非必要,否則不要設定随機種子。
順便提一下,在Java中有兩種方法可以獲得不同的随機數:通過java.util.Random類獲得随機數的原理和Math.random方法相同,Math.random()方法也是通過生成一個Random類的執行個體,然後委托nextDouble()方法的,兩者是殊途同歸,沒有差别。
注意 若非必要,不要設定随機數種子。
本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/5425094.html,如需轉載請自行聯系原作者