黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java隨機數中的陷阱

Java隨機數中的陷阱

更新時間:2021-04-28 12:42:26 來源:動力節點 瀏覽1031次

1.前言

隨機數我們應該不陌生,業務中我們用它來生成驗證碼,或者對重復性要求不高的id,甚至我們還用它在年會上搞抽獎。今天我們來探討一下這個東西。如果使用不當會引發一系列問題。

2.java中的隨機數

我們需要在Java中隨機生成一個數字。java開發中我們通常使用java.util.Random來搞,它提供了一種偽隨機的生成機制。Jvm 通過傳入的種子(seed)來確定生成隨機數的區間,只要種子一樣,獲取的隨機數的序列就是一致的。而且生成的結果都是可以預測的。是一種偽隨機數的實現,而不是真正的隨機數。來確定使用的但是有些用例直接使用可能會導致一些意想不到的問題。Random的一個普遍用法:

// Random 實例
Random random = new Random();
//調用 nextInt() 方法 此外還有nextDouble(), nextBoolean(), nextFloat(), ...
random.nextInt();

或者,我們可以使用java中的數學計算類:

Math.random();

Math類只包含一個Random實例來生成隨機數:

public static double random() {
    Random rnd = randomNumberGenerator;
    if (rnd == null) {
      // 返回一個新的Random實例
    rnd = initRNG();
   }
    return rnd.nextDouble();
    }

java.util.Random的用法是線程安全的。但是,在不同線程上并發使用相同的Random實例可能會導致爭用,從而導致性能不佳。其原因是使用所謂的種子來生成隨機數。種子是一個簡單的數字,它為生成新的隨機數提供了基礎。我們來看看Random中的next方法:

protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}

首先,舊種子和新種子存儲在兩個輔助變量上。在這一點上,創造新種子的原則并不重要。要保存新種子,使用compareAndSet()方法將舊種子替換為下一個新種子,但這僅僅在舊種子對應于當前設置的種子的條件下才會觸發。如果此時的值由并發線程操縱,則該方法返回false,這意味著舊值與例外值不匹配。因為是循環內進行的操作,那么會發生自旋,直到變量與例外值匹配。這可能會導致性能不佳和線程競爭。

3.多線程下的隨機數

如果更多線程主動生成具有相同Random的實例的新隨機數,則上述情況發生的概率越高。對于生成許多(非常多)隨機數的程序,不建議使用這種方式。在這種情況下,您應該使用ThreadLocalRandom,它在1.7版本中添加到Java中。ThreadLocalRandom擴展了Random并添加選項以限制其使用到相應的線程實例。為此,ThreadLocalRandom的實例保存在相應線程的內部映射中,并通過調用current()來返回對應的Random。

4.安全的隨機數

通過對Random 的一些分析我們可以知道Random事實上是偽隨機,是可以推導出規律的,而且依賴種子(seed)。如果我們搞抽獎或者其他一些對隨機數敏感的場景時,用Random就不合適了,容易被人鉆空子。JDK提供了SecureRandom來解決這個事情。

SecureRandom是強隨機數生成器,它可以產生高強度的隨機數,產生高強度的隨機數依賴兩個重要的因素:種子和算法。算法是可以有很多的,通常如何選擇種子是非常關鍵的因素。如Random,它的種子是System.currentTimeMillis(),所以它的隨機數都是可預測的, 是弱偽隨機數。強偽隨機數的生成思路:收集計算機的各種信息,鍵盤輸入時間,內存使用狀態,硬盤空閑空間,IO延時,進程數量,線程數量等信息,CPU時鐘,來得到一個近似隨機的種子,主要是達到不可預測性。說的更通俗就是,使用加密算法生成很長的一個隨機種子,讓你無法猜測出種子,也就無法推導出隨機序列數。

5.總結

今天我們探討了業務中經常使用的隨機數的一些機制和一些場景下的一些陷阱,希望你在使用隨機數的時候能避免這種陷阱。

以上就是動力節點小編介紹的"Java隨機數中的陷阱”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 一区二区三区免费在线观看 | 狠狠色成色综合网 | 亚洲欧美日韩另类在线一 | 一级做a免费视频观看网站 一男一女下面一进一出性视频 | 国产丝袜护土调教在线视频 | 黄色国产在线视频 | 欧美娇小极度另类 | 午夜夜伦鲁鲁片 | 国产特黄特色a级在线视频 国产特黄特色a级在线视 | 午夜视频在线观看网站 | 香蕉综合视频 | 亚洲aⅴ在线 | 日本娇小hd | 77788色淫免费网站视频 | 日韩精品欧美成人 | 久久久久久国产精品视频 | 国产a久久精品一区二区三区 | 国产欧美一区二区 | 91免费精品国偷自产在线在线 | 欧美视频在线播放 | 欧美深夜福利网站在线观看 | 在线久草视频 | 欧美一级专区免费大片 | 久久精品一区二区三区不卡牛牛 | 国产精品亚洲欧美日韩一区在线 | 永久在线毛片免费观看 | 日韩免费毛片全部不收费 | 亚洲国产成人精品一区二区三区 | 亚洲伊人久久大香线蕉苏妲己 | 色天使色婷婷在线影院亚洲 | 日韩手机视频 | 黄网在线观看 | 57pao国产成视频免费播放 | 51免费看片| 日本在线视频二区 | 在线视频 一区二区 | 久青草视频免费视频播放线路1 | 伊人网大香 | 亚洲欧美日韩综合一区久久 | 亚洲系列第一页 | 亚洲欧美综合另类 |