Java 提供多種隨機數生成方式,理解其底層原理與適用場景對於遊戲開發、加密、測試資料生成等場景至關重要。本文涵蓋 Random、SecureRandom、ThreadLocalRandom 核心用法與效能對比。
new Random() 以當前纳秒時間為種子,每次執行結果不同new Random(3L) 相同種子產生完全相同序列,利於測試複現Random random = new Random();
// 基礎型別
int n = random.nextInt(10); // 0~9
long l = random.nextLong(); // 長整數
double d = random.nextDouble(); // 0.0~1.0
boolean b = random.nextBoolean(); // true/false
// 指定範圍整數(JDK 1.7+)
int ranged = random.nextInt(5, 10); // 5~9
解決 Random 多線程共享種子導致的 CAS 競爭瓶頸,每個線程維護獨立種子:
// 靜態工廠方法,無需 new
int n = ThreadLocalRandom.current().nextInt(100);
long l = ThreadLocalRandom.current().nextLong(1000, 2000);
效能提升:高併發場景下較 Random 快 3-5 倍,推薦並行流、ForkJoinPool 等場景使用。
基於作業系統熵池(/dev/urandom、CryptGenRandom),種子不可預測,適用於:
SecureRandom sr = new SecureRandom();
byte[] salt = new byte[16];
sr.nextBytes(salt); // 生成 16 位元組安全隨機數
代價:比 Random 慢 10-100 倍,非安全場景勿用。
專為並行流設計,支援 split() 產生獨立子生成器,確保並行任務隨機數統計獨立性:
SplittableRandom sr = new SplittableRandom();
SplittableRandom sub = sr.split(); // 子生成器
| 場景 | 推薦類 | 關鍵特性 |
|---|---|---|
| 一般單線程/簡單測試 | Random | 輕量、可設種子複現 |
| 高併發、並行流 | ThreadLocalRandom | 無競爭、效能最優 |
| 安全敏感(Token、Key) | SecureRandom | 加密級、不可預測 |
| 並行遞歸任務 | SplittableRandom | 可分割、統計獨立 |
Math.random() 底層用共享 Random,多線程有競爭,棄用