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

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

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

    甜咖啡

    我的IT空間

    淺談Java中的幾種隨機數

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

    我們從書本上學到什么?

    最明顯的,也是直觀的方式,在Java中生成隨機數只要簡單的調用:

    1. java.lang.Math.random() 

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

    1. Math.random() * 10 

    而產生0和10之間的整數,則會寫成:

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

    進階

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

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

    它有一個缺點,就是它是一個對象。它的方法必須是通過一個實例來調用,這意味著必須先調用它的構造函數。如果在內存充足的情況下,像上面的表達式是可以接受的;但內存不足時,就會帶來問題。

    一個簡單的解決方案,可以避免每次需要生成一個隨機數時創建一個新實例,那就是使用一個靜態類。猜你可能想到了java.lang.Math,很好,我們就是改良java.lang.Math的初始化。雖然這個工程量低,但你也要做一些簡單的單元測試來確保其不會出錯。

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

    并發

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

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

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

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

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

    經驗

    Chris Marasti-Georg 指出:

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

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

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

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

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

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

    而使用:

    1. rnd.nextInt(n) 

    posted on 2012-04-16 10:01 甜咖啡 閱讀(183) 評論(0)  編輯  收藏


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


    網站導航:
     

    導航

    <2012年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    統計

    常用鏈接

    留言簿(1)

    我參與的團隊

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产人成精品| 免费观看男人免费桶女人视频 | 国产日本一线在线观看免费| 国产亚洲人成无码网在线观看| 一级特黄a免费大片| 亚洲午夜成人精品电影在线观看| 欧亚一级毛片免费看| 自拍偷自拍亚洲精品第1页| 久久九九免费高清视频| 国产精品亚洲片在线| 一个人免费日韩不卡视频| 亚洲精品视频在线观看免费 | 亚洲a无码综合a国产av中文| 国产精品高清视亚洲精品| www视频免费看| 中文字幕无码亚洲欧洲日韩| 国产国产人免费人成成免视频| 亚洲综合色成在线播放| 久草福利资源网站免费| 亚洲国产精品久久久久秋霞影院| 国产成人综合亚洲一区| 亚洲精品偷拍视频免费观看| 日本不卡免费新一区二区三区| 亚洲精品456在线播放| 热久久精品免费视频| 久久国产美女免费观看精品| 久久av无码专区亚洲av桃花岛| 成人免费午夜在线观看| ssswww日本免费网站片| 91大神亚洲影视在线| 国产精品久久香蕉免费播放| 亚洲国产精品成人午夜在线观看| 色影音免费色资源| 国产成人高清亚洲一区久久| 亚洲国产精品一区二区久久hs| 国产福利在线免费| 一区在线免费观看| 麻豆狠色伊人亚洲综合网站| 亚洲一区无码精品色| 在线视频免费观看爽爽爽| 国产激情久久久久影院老熟女免费|