成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Java中的幾種隨機數

開發 后端
眾所周知,隨機數是任何一種編程語言最基本的特征之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數??此坪唵危袝r我們也會忽略了一些有趣的功能。

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

我們從書本上學到什么?

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

  1. java.lang.Math.random() 

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

  1. Math.random() * 10 

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

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

進  階

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

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

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

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

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

并  發

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

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

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

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

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

Chris Marasti-Georg 指出:

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

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

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

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

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

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

而使用:

  1. rnd.nextInt(n) 

英文:http://www.summa-tech.com/blog/2012/03/14/the-several-flavors-of-random-in-java/

原文鏈接:http://www.oschina.net/question/157182_45274

【編輯推薦】

  1. Java編程中“為了性能”盡量要做的幾點
  2. 告別無止境的增刪改查:Java代碼生成器
  3. 使用JNI進行混合編程:在Java中調用C/C++本地庫
  4. Java通過SSH2協議運行遠程程序
  5. Java Socket編程:初識TCP Socket
責任編輯:林師授 來源: 開源中國社區
相關推薦

2011-07-08 15:11:03

JAVA

2019-09-11 10:09:00

Java虛擬機算法

2009-08-12 18:17:31

C#隨機數發生器

2015-10-13 10:00:58

Swift隨機數使用總結

2009-07-06 15:11:18

Java 隨機數

2021-06-01 22:31:57

區塊鏈隨機數技術

2023-01-03 07:49:45

Java隨機數線程

2010-09-06 17:40:59

SQL函數

2014-04-25 10:14:39

2009-06-11 15:16:18

不重復隨機數Java

2021-12-27 09:31:20

HashtableJava隨機數

2024-11-01 15:51:06

2025-01-17 00:00:00

Java隨機數服務

2010-10-09 15:35:25

MySQL rand函

2024-01-25 11:32:21

2010-03-22 19:41:31

2017-05-29 09:56:25

2009-12-08 11:44:14

PHP獲取隨機數

2014-05-13 10:21:00

2009-06-17 17:37:43

Java隨機數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美三级视频 | h视频免费在线观看 | 国产日产精品一区二区三区四区 | 国产清纯白嫩初高生视频在线观看 | 国产成人一区二区三区精 | 精品久久久久久久久久久久久久 | 91在线视频国产 | 国产三级一区二区 | 欧美日韩在线免费 | 中文日韩在线视频 | 亚洲成人在线视频播放 | 国产精品视频偷伦精品视频 | 91亚洲国产成人久久精品网站 | 日本不卡视频 | 天堂网av在线 | 国产一区二区三区四区在线观看 | 国产免费va| 久久草视频 | 天天操操| 91福利网| 亚洲一区二区在线播放 | 91精品国产一区二区三区 | 国产成人a亚洲精品 | 日韩国产免费 | 久久一| 亚洲精选一区 | 久久久久久亚洲精品不卡 | 日韩福利视频 | 美女在线一区二区 | 日日干夜夜操 | 九九热久久免费视频 | 国产精品久久久久久久模特 | 国产成人精品一区 | 91在线资源 | 久久精品国产亚洲一区二区 | 成人在线视频观看 | 午夜在线小视频 | 亚洲91视频 | 久久一区二区三区四区五区 | 国产综合av | 日韩一区中文字幕 |