<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    IT神童

    java,net,php技術(shù)研究神童

    淺談Java中的幾種隨機數(shù)

    摘要:眾所周知,隨機數(shù)是任何一種編程語言最基本的特征之一。而生成隨機數(shù)的基本方式也是相同的:產(chǎn)生一個0到1之間的隨機數(shù)。看似簡單,但有時我們也會忽略了一些有趣的功能。

    眾所周知,隨機數(shù)是任何一種編程語言最基本的特征之一。而生成隨機數(shù)的基本方式也是相同的:產(chǎn)生一個0到1之間的隨機數(shù)。看似簡單,但有時我們也會忽略了一些有趣的功能。

    我們從書本上學(xué)到什么?

    最明顯的,也是直觀的方式,在Java中生成隨機數(shù)只要簡單的調(diào)用:

    1. java.lang.Math.random() 

    在所有其他語言中,生成隨機數(shù)就像是使用Math工具類,如abs, pow, floor, sqrt和其他數(shù)學(xué)函數(shù)。大多數(shù)人通過書籍、教程和課程來了解這個類。一個簡單的例子:從0.0到1.0之間可以生成一個雙精度浮點數(shù)。那么通過上面的信息,開發(fā)人員要產(chǎn)生0.0和10.0之間的雙精度浮點數(shù)會這樣來寫:

    1. Math.random() * 10 

    而產(chǎn)生0和10之間的整數(shù),則會寫成:

    1. Math.round(Math.random() * 10) 

    進階

    通過閱讀Math.random()的源碼,或者干脆利用IDE的自動完成功能,開發(fā)人員可以很容易發(fā)現(xiàn),java.lang.Math.random()使用一個內(nèi)部的隨機生成對象 - 一個很強大的對象可以靈活的隨機產(chǎn)生:布爾值、所有數(shù)字類型,甚至是高斯分布。例如:

    1. new java.util.Random().nextInt(10) 

    它有一個缺點,就是它是一個對象。它的方法必須是通過一個實例來調(diào)用,這意味著必須先調(diào)用它的構(gòu)造函數(shù)。如果在內(nèi)存充足的情況下,像上面的表達式是可以接受的;但內(nèi)存不足時,就會帶來問題。java教程下載一個簡單的解決方案,可以避免每次需要生成一個隨機數(shù)時創(chuàng)建一個新實例,那就是使用一個靜態(tài)類。猜你可能想到了java.lang.Math,很好,我們就是改良java.lang.Math的初始化。雖然這個工程量低,但你也要做一些簡單的單元測試來確保其不會出錯。

    假設(shè)程序需要生成一個隨機數(shù)來存儲,問題就又來了。比如有時需要操作或保護種子(seed),一個內(nèi)部數(shù)用來存儲狀態(tài)和計算下一個隨機數(shù)。在這些特殊情況下,共用隨機生成對象是不合適的。

    并發(fā)

    在Java EE多線程應(yīng)用程序的環(huán)境中,隨機生成實例對象仍然可以被存儲在類或其他實現(xiàn)類,作為一個靜態(tài)屬性。幸運的是,java.util.Random是線程安全的,所以不存在多個線程調(diào)用會破壞種子(seed)的風(fēng)險。

    另一個值得考慮的是多線程java.lang.ThreadLocal的實例。偷懶的做法是通過Java本身API實現(xiàn)單一實例,當然你也可以確保每一個線程都有自己的一個實例對象。

    雖然Java沒有提供一個很好的方法來管理java.util.Random的單一實例。但是,期待已久的Java 7提供了一種新的方式來產(chǎn)生隨機數(shù):

    1. java.util.concurrent.ThreadLocalRandom.current().nextInt(10) 

    這個新的API綜合了其他兩種方法的優(yōu)點:單一實例/靜態(tài)訪問,就像Math.random()一樣靈活。ThreadLocalRandom也比其他任何處理高并發(fā)的方法要更快。

    經(jīng)驗

    Chris Marasti-Georg 指出:

    1. Math.round(Math.random() * 10) 

    使分布不平衡,例如:0.0 - 0.499999將四舍五入為0,而0.5至1.499999將四舍五入為1。那么如何使用舊式語法來實現(xiàn)正確的均衡分布,如下:

    1. Math.floor(Math.random() * 11) 

    幸運的是,如果我們使用java.util.Random或java.util.concurrent.ThreadLocalRandom就不用擔(dān)心上述問題了。

    Java實戰(zhàn)項目里面介紹了一些不正確使用java.util.Random API的危害。這個教訓(xùn)告訴我們不要使用:

    1. Math.abs(rnd.nextInt())%n 

    而使用:

    1. rnd.nextInt(n) 

    posted on 2012-08-22 10:19 IT神童 閱讀(203) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    <2012年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕乱码亚洲精品一区| 97人妻无码一区二区精品免费| 亚洲乱码在线观看| 国产亚洲综合一区柠檬导航| 波多野结衣视频在线免费观看| 7723日本高清完整版免费| 久久精品电影免费动漫| 七次郎成人免费线路视频 | 四虎精品成人免费视频| 色偷偷亚洲女人天堂观看欧| 久久国产精品亚洲一区二区| 亚洲日韩在线中文字幕第一页 | 亚洲an天堂an在线观看| 91麻豆精品国产自产在线观看亚洲 | 成人免费毛片内射美女-百度| 久久九九AV免费精品| 91在线视频免费观看| 一日本道a高清免费播放| 色妞www精品视频免费看| 亚洲av永久无码天堂网| 久久久久亚洲国产| 亚洲日韩国产精品乱-久| 亚洲乱码日产精品BD在线观看| 亚洲精品韩国美女在线| 久久亚洲精精品中文字幕| 亚洲国产精品VA在线看黑人 | 成人午夜免费视频| 一个人看的www在线免费视频| 狼色精品人妻在线视频免费| 男男gay做爽爽免费视频| 国产午夜亚洲精品不卡免下载| 亚洲AV女人18毛片水真多| 精品久久亚洲一级α| 国产亚洲漂亮白嫩美女在线| 亚洲AV无码资源在线观看| 国产精品亚洲专区一区| 永久免费精品影视网站| 两个人www免费高清视频| 国产精成人品日日拍夜夜免费| 暖暖免费日本在线中文| 99re免费在线视频|