欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java中隨機(jī)數(shù)的幾種實(shí)現(xiàn)方式

 更新時(shí)間:2015年07月12日 09:52:37   投稿:goldensun  
這篇文章主要介紹了Java中隨機(jī)數(shù)的幾種實(shí)現(xiàn)方式,從最簡(jiǎn)單的Math.random到多線程的并發(fā)實(shí)現(xiàn)都在本文所列之中,需要的朋友可以參考下

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

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

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

java.lang.Math.random()

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

Math.random() * 10

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

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

進(jìn)階

通過閱讀Math.random()的源碼,或者干脆利用IDE的自動(dòng)完成功能,開發(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ì)象。它的方法必須是通過一個(gè)實(shí)例來調(diào)用,這意味著必須先調(diào)用它的構(gòu)造函數(shù)。如果在內(nèi)存充足的情況下,像上面的表達(dá)式是可以接受的;但內(nèi)存不足時(shí),就會(huì)帶來問題。

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

假設(shè)程序需要生成一個(gè)隨機(jī)數(shù)來存儲(chǔ),問題就又來了。比如有時(shí)需要操作或保護(hù)種子(seed),一個(gè)內(nèi)部數(shù)用來存儲(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í)例。偷懶的做法是通過Java本身API實(shí)現(xiàn)單一實(shí)例,當(dāng)然你也可以確保每一個(gè)線程都有自己的一個(gè)實(shí)例對(duì)象。

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

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

這個(gè)新的API綜合了其他兩種方法的優(yōu)點(diǎn):?jiǎn)我粚?shí)例/靜態(tài)訪問,就像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。那么如何使用舊式語法來實(shí)現(xiàn)正確的均衡分布,如下:

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

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

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

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

而使用:

rnd.nextInt(n)

相關(guān)文章

  • MyBatis的mapper.xml文件中入?yún)⒑头祷刂档膶?shí)現(xiàn)

    MyBatis的mapper.xml文件中入?yún)⒑头祷刂档膶?shí)現(xiàn)

    這篇文章主要介紹了MyBatis的mapper.xml文件中入?yún)⒑头祷刂档膶?shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • java多線程有序讀取同一個(gè)文件

    java多線程有序讀取同一個(gè)文件

    這篇文章主要為大家詳細(xì)介紹了java多線程有序讀取同一個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java中if語句return用法和有無括號(hào)的區(qū)別

    Java中if語句return用法和有無括號(hào)的區(qū)別

    本文主要介紹了Java中if語句return用法和有無括號(hào)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Java通俗易懂系列設(shè)計(jì)模式之策略模式

    Java通俗易懂系列設(shè)計(jì)模式之策略模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之策略模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04
  • 關(guān)于Spring總結(jié)(必看篇)

    關(guān)于Spring總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄P(guān)于Spring總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用eclipse導(dǎo)入javaWeb項(xiàng)目的圖文教程

    使用eclipse導(dǎo)入javaWeb項(xiàng)目的圖文教程

    這篇文章主要介紹了如何使用eclipse導(dǎo)入別人的javaWeb項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 詳解MyBatis開發(fā)Dao層的兩種方式(Mapper動(dòng)態(tài)代理方式)

    詳解MyBatis開發(fā)Dao層的兩種方式(Mapper動(dòng)態(tài)代理方式)

    這篇文章主要介紹了詳解MyBatis開發(fā)Dao層的兩種方式(Mapper動(dòng)態(tài)代理方式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南

    SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南

    在項(xiàng)?開發(fā)中,對(duì)于前端提交的表單,后臺(tái)接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會(huì)加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Mac M1 Java 開發(fā)環(huán)境配置詳解

    Mac M1 Java 開發(fā)環(huán)境配置詳解

    這篇文章主要介紹了Mac M1 Java 開發(fā)環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實(shí)例

    Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實(shí)例

    本文主要介紹了Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評(píng)論