您好,歡迎來到賦能網(wǎng)!

Java如何生成隨機數(shù)?

賦能網(wǎng) 2023-05-10 96


    在 java 中,生成隨機數(shù)的場景有很多,所以本文我們就來盤點一下 4 種生成隨機數(shù)的方式,以及它們之間的區(qū)別和每種生成方式所對應(yīng)的場景。

1、Random

    Random 類誕生于 JDK 1.0,它產(chǎn)生的隨機數(shù)是偽隨機數(shù),也就是有規(guī)則的隨機數(shù)。Random 使用的隨機算法為 linear congruential pseudorandom number generator (LGC) 線性同余法偽隨機數(shù)。在隨機數(shù)生成時,隨機算法的起源數(shù)字稱為種子數(shù)(seed),在種子數(shù)的基礎(chǔ)上進行一定的變換,從而產(chǎn)生需要的隨機數(shù)字。

    Random 對象在種子數(shù)相同的情況下,相同次數(shù)生成的隨機數(shù)是相同的。比如兩個種子數(shù)相同的 Random 對象,第一次生成的隨機數(shù)字完全相同,第二次生成的隨機數(shù)字也完全相同。默認情況下 new Random() 使用的是當前納秒時間作為種子數(shù)的。

2、ThreadLocalRandom

    ThreadLocalRandom 是 JDK 1.7 新提供的類,它屬于 JUC(java.util.concurrent)下的一員,為什么有了 Random 之后還會再創(chuàng)建一個 ThreadLocalRandom?

    原因很簡單,通過上面 Random 的源碼我們可以看出,Random 在生成隨機數(shù)時使用的 CAS 來解決線程安全問題的,然而 CAS 在線程競爭比較激烈的場景中效率是非常低的,原因是 CAS 對比時老有其他的線程在修改原來的值,所以導致 CAS 對比失敗,所以它要一直循環(huán)來嘗試進行 CAS 操作。所以在多線程競爭比較激烈的場景可以使用 ThreadLocalRandom 來解決 Random 執(zhí)行效率比較低的問題。

    當我們第一眼看到 ThreadLocalRandom 的時候,一定會聯(lián)想到一次類 ThreadLocal,確實如此。ThreadLocalRandom 的實現(xiàn)原理與 ThreadLocal 類似,它相當于給每個線程一個自己的本地種子,從而就可以避免因多個線程競爭一個種子,而帶來的額外性能開銷了。

3、SecureRandom

    SecureRandom 繼承自 Random,該類提供加密強隨機數(shù)生成器。SecureRandom 不同于 Random,它收集了一些隨機事件,比如鼠標點擊,鍵盤點擊等,SecureRandom 使用這些隨機事件作為種子。這意味著,種子是不可預(yù)測的,而不像 Random 默認使用系統(tǒng)當前時間的毫秒數(shù)作為種子,從而避免了生成相同隨機數(shù)的可能性。

4、Math

    Math 類誕生于 JDK 1.0,它里面包含了用于執(zhí)行基本數(shù)學運算的屬性和方法,如初等指數(shù)、對數(shù)、平方根和三角函數(shù),當然它里面也包含了生成隨機數(shù)的靜態(tài)方法 Math.random() ,此方法會產(chǎn)生一個 0 到 1 的 double 值。
    其中 Math 是對 Random 的封裝,所以二者比較類似。Random 生成的是偽隨機數(shù),是以當前納秒時間作為種子數(shù)的,并且在多線程競爭比較激烈的情況下因為要進行 CAS 操作,所以存在一定的性能問題,但對于絕大數(shù)應(yīng)用場景來說,使用 Random 已經(jīng)足夠了。當在競爭比較激烈的場景下可以使用 ThreadLocalRandom 來替代 Random,但如果對安全性要求比較高的情況下,可以使用 SecureRandom 來生成隨機數(shù),因為 SecureRandom 會收集一些隨機事件來作為隨機種子,所以 SecureRandom 可以看作是生成真正隨機數(shù)的一個工具類。

  想了解更多相關(guān)資訊請關(guān)注java培訓頻道-查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費申請試課。關(guān)注賦能網(wǎng)了解更多:4008-569-579

本文鏈接:

本文章“Java如何生成隨機數(shù)?”已幫助 96 人

免責聲明:本信息由用戶發(fā)布,本站不承擔本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責任!

本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓機構(gòu)》培訓課程》學習資訊》課程優(yōu)惠》課程開班》學校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579

如果本頁不是您要找的課程,您也可以百度查找一下: