最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java中的n種隨機數產生辦法

 更新時間:2015年09月23日 15:18:29   投稿:lijiao  
眾所周知,隨機數是任何一種編程語言最基本的特征之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數??此坪唵?,但有時我們也會忽略了一些有趣的功能。

我們從書本上學到什么?

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

java.lang.Math.random() 

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

Math.random() * 10 

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

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

進  階

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

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

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

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

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

并  發(fā)

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

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

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

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

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

Chris Marasti-Georg 指出:

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

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

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

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

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

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

而使用:

rnd.nextInt(n) 

y以上就是關于Java中的n種隨機數的相關介紹,希望對大家的學習有所幫助。

相關文章

  • 詳解Spring中使用@within與@target的區(qū)別

    詳解Spring中使用@within與@target的區(qū)別

    這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過項目案例給大家詳細分析,給大家介紹的非常詳細,代碼簡單易懂,需要的朋友可以參考下
    2021-09-09
  • 利用exe4j生成java的exe文件

    利用exe4j生成java的exe文件

    本文主要介紹了利用exe4j生成java的exe文件,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解java中各類鎖的機制

    詳解java中各類鎖的機制

    這篇文章為大家總結了java中常見的鎖(互斥鎖、讀寫鎖、公平鎖與非公平鎖等)的機制以及如何使用,文中示例代碼講解詳細,需要的可以學習一下
    2021-12-12
  • Java使用POI生成Word文檔簡單代碼示例

    Java使用POI生成Word文檔簡單代碼示例

    Java?POI是一個用于操作Microsoft?Office格式文件的Java庫,包括?Word、Excel和PowerPoint等文件,這篇文章主要給大家介紹了關于Java使用POI生成Word文檔的相關資料,需要的朋友可以參考下
    2024-08-08
  • SpringSecurityOAuth2 如何自定義token信息

    SpringSecurityOAuth2 如何自定義token信息

    這篇文章主要介紹了SpringSecurityOAuth2 自定義token信息的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    文章主要介紹了Spring Boot 3.3.5版本中SpringDataJPA自動生成表時列順序混亂的問題,以及如何通過替換Hibernate實現來解決這個問題,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java 同步器SynchronousQueue詳解及實例

    java 同步器SynchronousQueue詳解及實例

    這篇文章主要介紹了java 同步器SynchronousQueue詳解及實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • 最值得Java開發(fā)者收藏的網站

    最值得Java開發(fā)者收藏的網站

    這篇文章主要為大家分享了最值得Java開發(fā)者收藏的11個網站,幫助Java開發(fā)者提升編程能力
    2016-11-11
  • MyBatis-Plus常見面試題和答案大全

    MyBatis-Plus常見面試題和答案大全

    Mybatis-Plus是一個基于Mybatis的增強工具,它簡化了Mybatis的開發(fā)流程,提供了許多實用的功能,如自動生成代碼、分頁查詢、條件構造器、性能分析等,這篇文章主要給大家介紹了關于MyBatis-Plus常見面試題和答案的相關資料,需要的朋友可以參考下
    2023-06-06
  • Java基礎教程之包(package)

    Java基礎教程之包(package)

    這篇文章主要介紹了Java基礎教程之包(package),本文詳細講解了包的創(chuàng)建、使用等方法,需要的朋友可以參考下
    2014-08-08

最新評論

忻城县| 元朗区| 永清县| 罗田县| 辽阳县| 竹山县| 新化县| 石阡县| 那坡县| 永顺县| 莱州市| 彰武县| 丰原市| 乌拉特后旗| 榕江县| 陆丰市| 天峨县| 盐城市| 攀枝花市| 河津市| 武威市| 尼木县| 上栗县| 会宁县| 霞浦县| 时尚| 大丰市| 甘洛县| 吕梁市| 定南县| 邯郸市| 连城县| 绿春县| 武宁县| 武穴市| 九寨沟县| 普陀区| 石狮市| 平顶山市| 海盐县| 宜阳县|