一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 淺談Java中隨機數(shù)的幾種實現(xiàn)方式

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

2019-12-26 13:22goldensun JAVA教程

這篇文章主要介紹了Java中隨機數(shù)的幾種實現(xiàn)方式,從最簡單的Math.random到多線程的并發(fā)實現(xiàn)都在本文所列之中,需要的朋友可以參考下

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

我們從書本上學到什么?

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

?
1
java.lang.Math.random()

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

?
1
Math.random() * 10

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

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

進階

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

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

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

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

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

并發(fā)

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

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

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

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

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

經(jīng)驗

Chris Marasti-Georg 指出:

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

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

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

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

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

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

而使用:

?
1
rnd.nextInt(n)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青青青手机在线视频 | 玩50岁四川熟女大白屁股直播 | 亚洲AV久久无码精品九号 | 99精品国产高清一区二区三区香蕉 | 成人福利在线 | 国产成人h视频在线播放网站 | 亚洲 综合 欧美在线视频 | 亚洲AV无码乱码在线观看浪潮 | 免费高清www动漫视频播放器 | 精品国产人成亚洲区 | 手机在线观看伦理片 | 我与么公激情性完整视频 | 国产麻豆传媒在线观看 | 天美网站传媒入口网址 | 男男浴室吸乳play | 亚洲入口 | 亚洲精品国精品久久99热 | 恩不要好大好硬好爽3p | 日韩aⅴ在线观看 | 男男playh片在线观看 | 小草观看免费高清视频 | 欧美日韩国产在线一区 | 果冻传媒在线观看的 | 亚洲AV无码一区二区三区乱子伦 | 青青草原国产在线 | 99综合视频 | 九九大香尹人视频免费 | 日本偷偷操| 亚洲国产成人久久综合一区 | a级情欲片在线观看hd | 日本三级免费观看 | 99ri在线精品视频在线播放 | 香蕉久久夜色精品国产尤物 | 2018天天弄 | 九九99九九精彩网站 | 亚洲欧美国产另类视频 | 免费精品在线 | 午夜福利理论片高清在线 | 91短视频在线免费观看 | 亚洲国产成人久久77 | 日本特级a禁片在线播放 |