Java random

Oracle Random 文件


如果 要取得一個 10 ... 100 間的亂數, 有幾種方式

測試程式 - github



1. Math.random()

   底層使用的是 Random 的 nextDouble(), 產生 double d, 1 > d >= 0


2. Random

   使用 Linear Congruential Algorithm

   Java 是用這個







3. ThreadLocalRandom

    因為是用 PRNG (pseduo random number generator) 在多工環境下, 

    為了確保 提供的數字是 random, 會使用 synchronized 來保護, 

    但也造成contention 問題, 無法平行處理.


    而有 ThreadLocal 跑在單一 thread 上來避免 contention 提高效率.

    

4. SecureRandom

   NIST 對亂數有份需求定義文件 FIPS 140-2

   在 RFC4086 也有對亂數的需求定義, 

   原本 Java Random 所用的 PRNG 方式是 屬於 

   DRBG (deterministic random bit generator)

   並不符合要求, 因此有 SecureRandom

   Secure Random Algorithm


   Algorithm 可以選用 NativePRNGNonBlocking. 這會使用系統的 /dev/urandom.

   /dev/urandom 函數會透過將裝置驅動程式、網路封包時段

   與其他來源等環境樣本(entropy)輸入 entropy pool 來產生隨機數值。 


    Github - patch


執行結果:





留言

熱門文章