日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Java中使用隨機數(shù)的正確姿勢是什么? java隨機數(shù)Random的使用

隨機數(shù)我們應(yīng)該不陌生 , 業(yè)務(wù)中我們用它來生成驗證碼 , 或者對重復(fù)性要求不高的id , 甚至我們還用它在年會上搞抽獎 。今天我們來探討一下這個東西 。如果使用不當(dāng)會引發(fā)一系列問題 。
java中的隨機數(shù)我們需要在Java中隨機生成一個數(shù)字 。java開發(fā)中我們通常使用java.util.Random來搞 , 它提供了一種偽隨機的生成機制 。Jvm 通過傳入的種子(seed)來確定生成隨機數(shù)的區(qū)間 , 只要種子一樣 , 獲取的隨機數(shù)的序列就是一致的 。而且生成的結(jié)果都是可以預(yù)測的 。是一種偽隨機數(shù)的實現(xiàn) , 而不是真正的隨機數(shù) 。來確定使用的但是有些用例直接使用可能會導(dǎo)致一些意想不到的問題 。Random的一個普遍用法:
【Java中使用隨機數(shù)的正確姿勢是什么? java隨機數(shù)Random的使用】// Random 實例Random random = new Random();//調(diào)用 nextInt() 方法 此外還有nextDouble(), nextBoolean(), nextFloat(), ...random.nextInt();或者 , 我們可以使用java中的數(shù)學(xué)計算類:
Math.random();Math類只包含一個Random實例來生成隨機數(shù):
public static double random() { Random rnd = randomNumberGenerator; if (rnd == null) { // 返回一個新的Random實例 rnd = initRNG(); } return rnd.nextDouble(); }java.util.Random的用法是線程安全的 。但是 , 在不同線程上并發(fā)使用相同的Random實例可能會導(dǎo)致爭用 , 從而導(dǎo)致性能不佳 。其原因是使用所謂的種子來生成隨機數(shù) 。種子是一個簡單的數(shù)字 , 它為生成新的隨機數(shù)提供了基礎(chǔ) 。我們來看看Random中的next(int bits)方法:
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));}首先 , 舊種子和新種子存儲在兩個輔助變量上 。在這一點上 , 創(chuàng)造新種子的原則并不重要 。要保存新種子 , 使用compareAndSet()方法將舊種子替換為下一個新種子 , 但這僅僅在舊種子對應(yīng)于當(dāng)前設(shè)置的種子的條件下才會觸發(fā) 。如果此時的值由并發(fā)線程操縱 , 則該方法返回false , 這意味著舊值與例外值不匹配 。因為是循環(huán)內(nèi)進行的操作 , 那么會發(fā)生自旋 , 直到變量與例外值匹配 。這可能會導(dǎo)致性能不佳和線程競爭 。
多線程下的隨機數(shù)如果更多線程主動生成具有相同Random的實例的新隨機數(shù) , 則上述情況發(fā)生的概率越高 。對于生成許多(非常多)隨機數(shù)的程序 , 不建議使用這種方式 。在這種情況下 , 您應(yīng)該使用ThreadLocalRandom , 它在1.7版本中添加到Java中 。ThreadLocalRandom擴展了Random并添加選項以限制其使用到相應(yīng)的線程實例 。為此 , ThreadLocalRandom的實例保存在相應(yīng)線程的內(nèi)部映射中 , 并通過調(diào)用current()來返回對應(yīng)的Random 。使用方式如下:
ThreadLocalRandom.current().nextInt()安全的隨機數(shù)通過對Random的一些分析我們可以知道Random事實上是偽隨機 , 是可以推導(dǎo)出規(guī)律的 , 而且依賴種子(seed) 。如果我們搞抽獎或者其他一些對隨機數(shù)敏感的場景時 , 用Random就不合適了 , 容易被人鉆空子 。JDK提供了SecureRandom來解決這個事情 。

推薦閱讀