java.lang.Math.Random()與java.util.Random生成隨機數的區別

          一個是方法一個是對象之類的廢話就不說了。關鍵在與兩個生成隨機數的不同特征。
          因為在做圖像特征提取,對整個像素空間的逐個提取、識別顯然不太聰明,于是乎想起概率論上的一堆東東。
          取得一個可以反應整個向量空間的隨機數集合,不失為明智的選擇。

          《Think in Java》里面經常用那個對象弄,自然我首先想到了這個。同學則喜歡Math.Random,他認為生成的是一個在區間均勻分布的符合要求的隨機數。以前從來沒想過“隨機”這個問題,到底是一個任意的數(各個概率一樣,就像古典概型里面,硬幣的正反一樣),還是一個在空間有均勻分布特征的呢?

          在網上搜羅了一大堆東西,發現說什么的都有,越來越迷糊。最后想起該看看權威的JDK API說明乎:

          random(注:java.lang.Math)
          public static double random()
          返回帶正號的 
          double 值,該值大于等于 0.0 且小于 1.0。返回值是一個偽隨機選擇的數,在該范圍內(近似)均勻分布。 
          第一次調用該方法時,它將創建一個新的偽隨機數生成器,與以下表達式完全相同 

          new java.util.Random
          之后,新的偽隨機數生成器可用于此方法的所有調用,但不能用于其他地方。 
          此方法是完全同步的,可允許多個線程使用而不出現錯誤。但是,如果許多線程需要以極高的速率生成偽隨機數,那么這可能會減少每個線程對擁有自己偽隨機數生成器的爭用。 


          返回: 
          大于等于 
          0.0 且小于 1.0 的偽隨機 double 值。 

          下面是java.util里面的

          java.util 
          類 Random
          java.lang.Object
            java.util.Random
          所有已實現的接口: 
          Serializable 
          直接已知子類: 
          SecureRandom 

          --------------------------------------------------------------------------------

          public class Randomextends Objectimplements Serializable此類的實例用于生成偽隨機數流。此類使用 48 位的種子,使用線性同余公式 (linear congruential form) 對其進行了修改(請參閱 Donald Knuth 的The Art of Computer Programming, Volume 3,第 3.2.1 節)。 

          如果用相同的種子創建兩個 Random 實例,則對每個實例進行相同的方法調用序列,它們將生成并返回相同的數字序列。為了保證此屬性的實現,為類 Random 指定了特定的算法。為了 Java 代碼的完全可移植性,Java 實現必須讓類 Random 使用此處所示的所有算法。但是允許 Random 類的子類使用其他算法,只要其符合所有方法的常規協定即可。 

          Random 類實現的算法使用一個 
          protected 實用工具方法,每次調用它最多可提供 32 個偽隨機生成的位。 

          很多應用程序會發現 Math.random() 方法更易于使用。 


          看看下面的就更加顯而易見啦
          next
          protected int next(int bits)生成下一個偽隨機數。當被所有其他方法使用時,子類應該重寫此方法。 
          next 的常規協定是,返回一個 
          int 值,如果參數 bits 位處于 1 和 32(包括)之間,那么返回值的多數低位都將(大致)是單獨選擇的位值,每個位值是 0 或 1 的機會(大致)相等。通過將種子自動更新為 

          (seed 
          * 0x5DEECE66DL + 0xBL& ((1L << 48- 1)并返回 
          (
          int)(seed >>> (48 - bits)),Random 類可實現 next 方法。這是一個線性同余偽隨機數生成器,由 D. H. Lehmer 定義,Donald E. Knuth 在 The Art of Computer Programming, Volume 3: Seminumerical Algorithms 的第 3.2.1 節中進行了描述。 

          參數:
          bits 
          - 隨機位。 
          返回:
          隨機數生成器序列的下一個偽隨機值。

          于是我的結論如下:
          1:java.lang.Math.Random()這個靜態方法得到的是一個空間中有均勻分布特征的隨機數。
          2:java.util.Random,通過這個對象得到的則是“幾何分布”
          3:我的圖像特征應該選擇第一個方法比較適當。

          問題:我的似乎應該說是一個抽樣問題更為恰當。呼呼,先寫到這里


          啦啦啦,請高人指教。

          posted on 2008-05-01 17:15 Jarod.cn.LuLuLife 閱讀(26713) 評論(3)  編輯  收藏

          評論

          # re: java.lang.Math.Random()與java.util.Random生成隨機數的區別[未登錄] 2008-05-30 23:37 ZZ

          請問你能不能用C編寫一個生成正態分布隨機數的程序,而且是用中心極限定理和Box-Muller變換兩種方法產生的???
            回復  更多評論   

          # re: java.lang.Math.Random()與java.util.Random生成隨機數的區別 2008-05-31 01:07 Jarod.cn.LuLuLife


          1 : double _sta( double mu, double sigma) // 利用中心極限定理生成
          2 {
          3 int i;
          4 double r,sum = 0.0 ;
          5
          6 if (sigma <= 0.0 ) { printf( " Sigma<=0.0 in _sta! " ); exit( 1 ); }
          7 for (i = 1 ;i <= 12 ;i ++ )
          8 sum = sum + _random();
          9 r = (sum - 6.00 ) * sigma + mu;
          10
          11 return r;
          12
          13 }

          (網上很多吧,自己驗證哈,我也是搜來的。)  回復  更多評論   

          # re: java.lang.Math.Random()與java.util.Random生成隨機數的區別 2009-03-25 15:38 P.W

          贊一下鉆研的精神~  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          公告

          我的知識Blog!

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          Image

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黄骅市| 抚松县| 大丰市| 黔西| 丹巴县| 泗水县| 灵台县| 响水县| 鱼台县| 姚安县| 比如县| 镇原县| 中宁县| 滦南县| 江阴市| 桐柏县| 金湖县| 台中市| 神农架林区| 电白县| 阿坝| 邻水| 香河县| 东方市| 浑源县| 白玉县| 和顺县| 方城县| 华蓥市| 五台县| 泗水县| 平果县| 城固县| 留坝县| 唐山市| 长治市| 多伦县| 密云县| 馆陶县| 南和县| 噶尔县|