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

Java 隨機數生成全攻略:從 Math.random() 到 ThreadLocalRandom

     編輯:Java 相關知識

基礎入門:Math.random()

最直觀的方式:

double r = Math.random(); // 0.0 ~ 1.0
double r10 = Math.random() * 10; // 0.0 ~ 10.0
int rInt = (int) (Math.random() * 10); // 0 ~ 9

陷阱:Math.round(Math.random() * 10) 分布不均(0 和 10 機率僅為其他數字一半)。正確均勻寫法:(int) (Math.random() * 11) 或 Math.floor(Math.random() * 11)。

進階:java.util.Random

Random rnd = new Random();
int n = rnd.nextInt(10); // 0 ~ 9,均勻分布
boolean b = rnd.nextBoolean();
double gaussian = rnd.nextGaussian(); // 高斯分布
  • 優點:功能豐富、支援種子控制(new Random(seed))、可產生多種型別。
  • 缺點:需建立物件;多執行緒共用同一實例雖線程安全,但高併發下會成為效能瓶頸(CAS 競爭種子)。

高併發首選:ThreadLocalRandom (Java 7+)

int n = ThreadLocalRandom.current().nextInt(10);
  • 零競爭:每個執行緒持有獨立實例,無同步開銷。
  • 靜態存取:如 Math.random() 般便利,但效能更強。
  • API 豐富:支援 nextInt(origin, bound)、nextLong()、nextDouble() 等。

常見錯誤與最佳實踐

錯誤寫法問題正確寫法
Math.abs(rnd.nextInt()) % n負數絕對值溢位、模運算偏差rnd.nextInt(n)
new Random() 在迴圈中重複建立種子相近導致序列重複重用單一實例或用 ThreadLocalRandom
直接用 Math.random() 做高併發內部同步鎖爭用改用 ThreadLocalRandom

選型建議

  • 簡單腳本/測試:Math.random() 足矣。
  • 需控制種子/產生高斯分布:java.util.Random。
  • 多執行緒高併發環境:強烈推薦 ThreadLocalRandom。
  • 加密級安全性:java.security.SecureRandom。
隨機數看似簡單,分布均勻、執行緒安全、種子管理樣樣是坑。選對工具,事半功倍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved