首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 隨機數生成完全指南:Random、偽隨機與 ThreadLocalRandom 實戰

     編輯:Java 程式設計入門

Java 提供多種隨機數生成方式,理解其底層原理與適用場景對於遊戲開發、加密、測試資料生成等場景至關重要。本文涵蓋 Random、SecureRandom、ThreadLocalRandom 核心用法與效能對比。

1. 基礎隨機數:java.util.Random

種子機制

  • 系統時間種子(預設):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

2. 多線程高效能:ThreadLocalRandom(JDK 1.7+)

解決 Random 多線程共享種子導致的 CAS 競爭瓶頸,每個線程維護獨立種子:

// 靜態工廠方法,無需 new
int n = ThreadLocalRandom.current().nextInt(100);
long l = ThreadLocalRandom.current().nextLong(1000, 2000);

效能提升:高併發場景下較 Random 快 3-5 倍,推薦並行流、ForkJoinPool 等場景使用。

3. 加密級安全:SecureRandom

基於作業系統熵池(/dev/urandom、CryptGenRandom),種子不可預測,適用於:

  • Session ID、Token 生成
  • 加密金鑰、鹽值生成
  • 任何需防暴力破解的場景
SecureRandom sr = new SecureRandom();
byte[] salt = new byte[16];
sr.nextBytes(salt); // 生成 16 位元組安全隨機數

代價:比 Random 慢 10-100 倍,非安全場景勿用。

4. 進階:SplittableRandom(JDK 1.8+)

專為並行流設計,支援 split() 產生獨立子生成器,確保並行任務隨機數統計獨立性:

SplittableRandom sr = new SplittableRandom();
SplittableRandom sub = sr.split(); // 子生成器

選型決策表

場景推薦類關鍵特性
一般單線程/簡單測試Random輕量、可設種子複現
高併發、並行流ThreadLocalRandom無競爭、效能最優
安全敏感(Token、Key)SecureRandom加密級、不可預測
並行遞歸任務SplittableRandom可分割、統計獨立

常見坑點提醒

  • Math.random() 底層用共享 Random,多線程有競爭,棄用
  • 固定種子僅用於測試/除錯,生產環境嚴禁
  • 大量生成時重用實例,避免頻繁創建開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved