午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

Java隨機(jī)數(shù)的幾種有趣用法

瀏覽:25日期:2022-09-06 13:07:16

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

Java隨機(jī)數(shù)的幾種有趣用法

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

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

java.lang.Math.random()

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

Math.random() * 10

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

Math.round(Math.random() * 10)進(jìn)階

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

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

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

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

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

并發(fā)

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

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

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

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

這個新的API綜合了其他兩種方法的優(yōu)點(diǎ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的危害。這個教訓(xùn)告訴我們不要使用:

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

而使用:

rnd.nextInt(n)

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 午夜神马影院 | 国产性自拍 | 亚洲成人网在线 | 最近日韩免费视频 | 日本不卡在线观看 | 国产精品国产三级国产普通话蜜臀 | 免费精品一区二区 | 高清免费av | 婷婷五月小说 | 99九九视频 | 日本黄色小说视频 | 亚洲成人福利视频 | 337p亚洲精品色噜噜噜 | 国产剧情av在线播放 | 热热热热色 | 日韩av资源 | 欧美俄罗斯乱妇 | 欧美在线不卡 | 欧美一区二区在线 | 免费在线播放av | 插插插色综合 | 亚洲色图av在线 | 日本黄色免费观看 | 国产精品美女一区 | 色伊人久久| 91最新国产 | 日韩福利视频导航 | 精品国产乱码久久久久久婷婷 | 国产小视频网站 | 久久久久无码国产精品一区 | 激情五月婷婷综合 | 无限资源欧美 | 色国产精品| 国产精品自拍在线 | 日韩性高潮 | 91国内精品久久久久 | 韩国黄色网址 | 天天干天天色综合 | 亚洲男人天堂网 | 久久免费网 | 天天做天天爽 |