首頁 Java java教程 Java隨機數的幾個有趣用法

Java隨機數的幾個有趣用法

Nov 26, 2016 am 09:16 AM
java

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

Java隨機數的幾個有趣用法

我們從書本上學到什麼?

  最明顯的,也是直觀的方式,在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.0 – 0.499999將四捨五入為0,而分佈為0.5914999為199099為0,而五捨五入為0,而五入為099914999為19991939。那麼如何使用舊式語法來實現正確的均衡分佈,如下:

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)
登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的平方根 Java 中的平方根 Aug 30, 2024 pm 04:26 PM

Java 中的平方根

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 中的完美數

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 中的隨機數產生器

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java中的Weka

Java 中的阿姆斯壯數 Java 中的阿姆斯壯數 Aug 30, 2024 pm 04:26 PM

Java 中的阿姆斯壯數

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 中的史密斯數

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

Java Spring 面試題

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

突破或從Java 8流返回?

See all articles