程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺談Java中隨機數的幾種完成方法

淺談Java中隨機數的幾種完成方法

編輯:關於JAVA

淺談Java中隨機數的幾種完成方法。本站提示廣大學習愛好者:(淺談Java中隨機數的幾種完成方法)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談Java中隨機數的幾種完成方法正文


盡人皆知,隨機數是任何一種編程說話最根本的特點之一。而生成隨機數的根本方法也是雷同的:發生一個0到1之間的隨機數。看似簡略,但有時我們也會疏忽了一些風趣的功效。

我們從書本上學到甚麼?

最顯著的,也是直不雅的方法,在Java中生成隨機數只需簡略的挪用:

java.lang.Math.random()

在一切其他說話中,生成隨機數就像是應用Math對象類,如abs, pow, floor, sqrt和其他數學函數。年夜多半人經由過程書本、教程和課程來懂得這個類。一個簡略的例子:從0.0到1.0之間可以生成一個雙精度浮點數。那末經由過程下面的信息,開辟人員要發生0.0和10.0之間的雙精度浮點數會如許來寫:

Math.random() * 10

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

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

進階

經由過程浏覽Math.random()的源碼,或許爽性應用IDE的主動完勝利能,開辟人員可以很輕易發 現,java.lang.Math.random()應用一個外部的隨機生成對象 - 一個很壯大的對象可以靈巧的隨機發生:布爾值、一切數字類型,乃至是高斯散布。例如:

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供給了一種新的方法來發生隨機數:

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

這個新的API綜合了其他兩種辦法的長處:單一實例/靜態拜訪,就像Math.random()一樣靈巧。ThreadLocalRandom也比其他任何處置高並發的辦法要更快。

經歷

Chris Marasti-Georg 指出:

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

使散布不屈衡,例如:0.0 - 0.499999將四捨五入為0,而0.5至1.499999將四捨五入為1。那末若何應用新式語法來完成准確的平衡散布,以下:

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

榮幸的是,假如我們應用java.util.Random或java.util.concurrent.ThreadLocalRandom就不消擔憂上述成績了。

Java實戰項目外面引見了一些不准確應用java.util.Random API的傷害。這個經驗告知我們不要應用:

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

而應用:

rnd.nextInt(n)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved