Java 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
Algorithm 可以選用 NativePRNGNonBlocking. 這會使用系統的 /dev/urandom.
/dev/urandom 函數會透過將裝置驅動程式、網路封包時段
與其他來源等環境樣本(entropy)輸入 entropy pool 來產生隨機數值。
執行結果:
留言
張貼留言