大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Java隨機(jī)數(shù)中的陷阱

Java隨機(jī)數(shù)中的陷阱

更新時(shí)間:2021-04-28 12:42:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1035次

1.前言

隨機(jī)數(shù)我們應(yīng)該不陌生,業(yè)務(wù)中我們用它來(lái)生成驗(yàn)證碼,或者對(duì)重復(fù)性要求不高的id,甚至我們還用它在年會(huì)上搞抽獎(jiǎng)。今天我們來(lái)探討一下這個(gè)東西。如果使用不當(dāng)會(huì)引發(fā)一系列問(wèn)題。

2.java中的隨機(jī)數(shù)

我們需要在Java中隨機(jī)生成一個(gè)數(shù)字。java開(kāi)發(fā)中我們通常使用java.util.Random來(lái)搞,它提供了一種偽隨機(jī)的生成機(jī)制。Jvm 通過(guò)傳入的種子(seed)來(lái)確定生成隨機(jī)數(shù)的區(qū)間,只要種子一樣,獲取的隨機(jī)數(shù)的序列就是一致的。而且生成的結(jié)果都是可以預(yù)測(cè)的。是一種偽隨機(jī)數(shù)的實(shí)現(xiàn),而不是真正的隨機(jī)數(shù)。來(lái)確定使用的但是有些用例直接使用可能會(huì)導(dǎo)致一些意想不到的問(wèn)題。Random的一個(gè)普遍用法:

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

或者,我們可以使用java中的數(shù)學(xué)計(jì)算類:

Math.random();

Math類只包含一個(gè)Random實(shí)例來(lái)生成隨機(jī)數(shù):

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

java.util.Random的用法是線程安全的。但是,在不同線程上并發(fā)使用相同的Random實(shí)例可能會(huì)導(dǎo)致?tīng)?zhēng)用,從而導(dǎo)致性能不佳。其原因是使用所謂的種子來(lái)生成隨機(jī)數(shù)。種子是一個(gè)簡(jiǎn)單的數(shù)字,它為生成新的隨機(jī)數(shù)提供了基礎(chǔ)。我們來(lái)看看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));
}

首先,舊種子和新種子存儲(chǔ)在兩個(gè)輔助變量上。在這一點(diǎn)上,創(chuàng)造新種子的原則并不重要。要保存新種子,使用compareAndSet()方法將舊種子替換為下一個(gè)新種子,但這僅僅在舊種子對(duì)應(yīng)于當(dāng)前設(shè)置的種子的條件下才會(huì)觸發(fā)。如果此時(shí)的值由并發(fā)線程操縱,則該方法返回false,這意味著舊值與例外值不匹配。因?yàn)槭茄h(huán)內(nèi)進(jìn)行的操作,那么會(huì)發(fā)生自旋,直到變量與例外值匹配。這可能會(huì)導(dǎo)致性能不佳和線程競(jìng)爭(zhēng)。

3.多線程下的隨機(jī)數(shù)

如果更多線程主動(dòng)生成具有相同Random的實(shí)例的新隨機(jī)數(shù),則上述情況發(fā)生的概率越高。對(duì)于生成許多(非常多)隨機(jī)數(shù)的程序,不建議使用這種方式。在這種情況下,您應(yīng)該使用ThreadLocalRandom,它在1.7版本中添加到Java中。ThreadLocalRandom擴(kuò)展了Random并添加選項(xiàng)以限制其使用到相應(yīng)的線程實(shí)例。為此,ThreadLocalRandom的實(shí)例保存在相應(yīng)線程的內(nèi)部映射中,并通過(guò)調(diào)用current()來(lái)返回對(duì)應(yīng)的Random。

4.安全的隨機(jī)數(shù)

通過(guò)對(duì)Random 的一些分析我們可以知道Random事實(shí)上是偽隨機(jī),是可以推導(dǎo)出規(guī)律的,而且依賴種子(seed)。如果我們搞抽獎(jiǎng)或者其他一些對(duì)隨機(jī)數(shù)敏感的場(chǎng)景時(shí),用Random就不合適了,容易被人鉆空子。JDK提供了SecureRandom來(lái)解決這個(gè)事情。

SecureRandom是強(qiáng)隨機(jī)數(shù)生成器,它可以產(chǎn)生高強(qiáng)度的隨機(jī)數(shù),產(chǎn)生高強(qiáng)度的隨機(jī)數(shù)依賴兩個(gè)重要的因素:種子和算法。算法是可以有很多的,通常如何選擇種子是非常關(guān)鍵的因素。如Random,它的種子是System.currentTimeMillis(),所以它的隨機(jī)數(shù)都是可預(yù)測(cè)的, 是弱偽隨機(jī)數(shù)。強(qiáng)偽隨機(jī)數(shù)的生成思路:收集計(jì)算機(jī)的各種信息,鍵盤輸入時(shí)間,內(nèi)存使用狀態(tài),硬盤空閑空間,IO延時(shí),進(jìn)程數(shù)量,線程數(shù)量等信息,CPU時(shí)鐘,來(lái)得到一個(gè)近似隨機(jī)的種子,主要是達(dá)到不可預(yù)測(cè)性。說(shuō)的更通俗就是,使用加密算法生成很長(zhǎng)的一個(gè)隨機(jī)種子,讓你無(wú)法猜測(cè)出種子,也就無(wú)法推導(dǎo)出隨機(jī)序列數(shù)。

5.總結(jié)

今天我們探討了業(yè)務(wù)中經(jīng)常使用的隨機(jī)數(shù)的一些機(jī)制和一些場(chǎng)景下的一些陷阱,希望你在使用隨機(jī)數(shù)的時(shí)候能避免這種陷阱。

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java隨機(jī)數(shù)中的陷阱”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 日本一级成人毛片免费观看 | 国产成人无精品久久久 | 欧美成人网在线综合视频 | 亚洲欧美日韩精品久久 | 久久精品在线观看 | 伊人成影院九九 | 色狠狠狠色噜噜噜综合网 | 成人夜色视频在线观看网站 | 久热精品香蕉在线视频 | 久草男人天堂 | 免费a视频在线观看 | 亚洲欧美日韩在线不卡 | 国产午夜爽爽窝窝在线观看 | 国产精品午夜久久 | 一级特黄性色生活片 | 天天干天天草天天 | 亚洲色欲色欲www | 久久久久国产精品 | 久久久久久亚洲精品中文字幕 | 国产高清不卡一区二区三区 | 亚洲精品国产一区二区 | 欧美激情社区 | 日本中文字幕一区二区有码在线 | 精品国产麻豆 | 亚洲激情视频在线播放 | 久久青草国产精品一区 | 免费视频不卡 | 亚洲精品日本一区二区在线 | 99久久中文字幕伊人情人 | 久久在线精品视频 | 精品久久不卡 | 亚洲高清不卡视频 | 在线视频a| 久久国产精品ww | 亚洲欧美日韩综合一区久久 | 亚洲精品综合一二三区在线 | 亚州综合| 国产精品揄拍一区二区久久 | 久热伊人| 亚洲精品色一区二区三区 | 欧美一区二区在线观看视频 |