java.lang.Math.Random()與java.util.Random生成隨機(jī)數(shù)的區(qū)別

          一個(gè)是方法一個(gè)是對(duì)象之類的廢話就不說了。關(guān)鍵在與兩個(gè)生成隨機(jī)數(shù)的不同特征。
          因?yàn)樵谧鰣D像特征提取,對(duì)整個(gè)像素空間的逐個(gè)提取、識(shí)別顯然不太聰明,于是乎想起概率論上的一堆東東。
          取得一個(gè)可以反應(yīng)整個(gè)向量空間的隨機(jī)數(shù)集合,不失為明智的選擇。

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

          在網(wǎng)上搜羅了一大堆東西,發(fā)現(xiàn)說什么的都有,越來越迷糊。最后想起該看看權(quán)威的JDK API說明乎:

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

          new java.util.Random
          之后,新的偽隨機(jī)數(shù)生成器可用于此方法的所有調(diào)用,但不能用于其他地方。 
          此方法是完全同步的,可允許多個(gè)線程使用而不出現(xiàn)錯(cuò)誤。但是,如果許多線程需要以極高的速率生成偽隨機(jī)數(shù),那么這可能會(huì)減少每個(gè)線程對(duì)擁有自己偽隨機(jī)數(shù)生成器的爭(zhēng)用。 


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

          下面是java.util里面的

          java.util 
          類 Random
          java.lang.Object
            java.util.Random
          所有已實(shí)現(xiàn)的接口: 
          Serializable 
          直接已知子類: 
          SecureRandom 

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

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

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

          Random 類實(shí)現(xiàn)的算法使用一個(gè) 
          protected 實(shí)用工具方法,每次調(diào)用它最多可提供 32 個(gè)偽隨機(jī)生成的位。 

          很多應(yīng)用程序會(huì)發(fā)現(xiàn) Math.random() 方法更易于使用。 


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

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

          參數(shù):
          bits 
          - 隨機(jī)位。 
          返回:
          隨機(jī)數(shù)生成器序列的下一個(gè)偽隨機(jī)值。

          于是我的結(jié)論如下:
          1:java.lang.Math.Random()這個(gè)靜態(tài)方法得到的是一個(gè)空間中有均勻分布特征的隨機(jī)數(shù)。
          2:java.util.Random,通過這個(gè)對(duì)象得到的則是“幾何分布”
          3:我的圖像特征應(yīng)該選擇第一個(gè)方法比較適當(dāng)。

          問題:我的似乎應(yīng)該說是一個(gè)抽樣問題更為恰當(dāng)。呼呼,先寫到這里


          啦啦啦,請(qǐng)高人指教。

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

          評(píng)論

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

          請(qǐng)問你能不能用C編寫一個(gè)生成正態(tài)分布隨機(jī)數(shù)的程序,而且是用中心極限定理和Box-Muller變換兩種方法產(chǎn)生的???
            回復(fù)  更多評(píng)論   

          # re: java.lang.Math.Random()與java.util.Random生成隨機(jī)數(shù)的區(qū)別 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 }

          (網(wǎng)上很多吧,自己驗(yàn)證哈,我也是搜來的。)  回復(fù)  更多評(píng)論   

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

          贊一下鉆研的精神~  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          我的知識(shí)Blog!

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          Image

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 外汇| 庄河市| 通城县| 丹棱县| 平阴县| 杭锦后旗| 琼海市| 台东县| 繁昌县| 封开县| 丰顺县| 香格里拉县| 保山市| 台江县| 靖西县| 巴东县| 新干县| 兰西县| 湟源县| 赤城县| 镇雄县| 南陵县| 大厂| 大姚县| 山西省| 云龙县| 凤城市| 灵川县| 禹州市| 拉萨市| 樟树市| 城固县| 迁西县| 瑞金市| 三门峡市| 腾冲县| 基隆市| 肃南| 子长县| 陕西省| 奉新县|