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

淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

 更新時(shí)間:2015年09月23日 15:18:29   投稿:lijiao  
眾所周知,隨機(jī)數(shù)是任何一種編程語(yǔ)言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù)??此坪?jiǎn)單,但有時(shí)我們也會(huì)忽略了一些有趣的功能。

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

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

java.lang.Math.random() 

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

Math.random() * 10 

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

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

進(jìn)  階

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

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

它有一個(gè)缺點(diǎn),就是它是一個(gè)對(duì)象。它的方法必須是通過(guò)一個(gè)實(shí)例來(lái)調(diào)用,這意味著必須先調(diào)用它的構(gòu)造函數(shù)。如果在內(nèi)存充足的情況下,像上面的表達(dá)式是可以接受的;但內(nèi)存不足時(shí),就會(huì)帶來(lái)問(wèn)題。

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

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

并  發(fā)

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

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

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

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

這個(gè)新的API綜合了其他兩種方法的優(yōu)點(diǎn):?jiǎn)我粚?shí)例/靜態(tài)訪問(wèn),就像Math.random()一樣靈活。ThreadLocalRandom也比其他任何處理高并發(fā)的方法要更快。
經(jīng)驗(yàn)

Chris Marasti-Georg 指出:

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

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

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

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

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

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

而使用:

rnd.nextInt(n) 

y以上就是關(guān)于Java中的n種隨機(jī)數(shù)的相關(guān)介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

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

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

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

    利用exe4j生成java的exe文件

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

    詳解java中各類鎖的機(jī)制

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

    Java使用POI生成Word文檔簡(jiǎn)單代碼示例

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

    SpringSecurityOAuth2 如何自定義token信息

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

    Spring Data JPA自動(dòng)生成表時(shí)列順序混亂的最新解決辦法

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

    java 同步器SynchronousQueue詳解及實(shí)例

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

    最值得Java開(kāi)發(fā)者收藏的網(wǎng)站

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

    MyBatis-Plus常見(jiàn)面試題和答案大全

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

    Java基礎(chǔ)教程之包(package)

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

最新評(píng)論

丰城市| 甘肃省| 新和县| 安福县| 东兴市| 红桥区| 关岭| 新民市| 梨树县| 汉寿县| 杭州市| 双鸭山市| 封丘县| 邵东县| 丹东市| 宁晋县| 龙州县| 巧家县| 芮城县| 炎陵县| 宜春市| 五家渠市| 大余县| 乐东| 夏津县| 平塘县| 南乐县| 景洪市| 葵青区| 茶陵县| 郁南县| 凌源市| 嘉鱼县| 天祝| 阜城县| 甘南县| 潍坊市| 淮阳县| 鹤壁市| 威海市| 梓潼县|