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

Java 隨機數生成完全指南:Random 類核心用法與範圍控制技巧

     編輯:Java 相關知識

核心類:java.util.Random

Random 類是 Java 標準庫中生成偽隨機數的基礎工具,採用線性同餘算法,線程安全但非加密安全。若需密碼學級隨機數,請使用 SecureRandom。

構造方法與種子機制

// 默認構造:以 System.currentTimeMillis() 為種子
Random random = new Random();
// 等價於
Random random = new Random(System.currentTimeMillis());

// 指定種子:相同種子產生完全相同的序列,便於測試復現
Random random = new Random(10010010L);

關鍵結論:種子決定整個隨機序列。生產環境建議使用默認構造(時間種子),單元測試時固定種子以獲得確定性輸出。

基本隨機數生成 API

方法返回類型範圍典型用途
nextInt()int-2^31 ~ 2^31-1通用整數
nextLong()long-2^63 ~ 2^63-1長整數 ID
nextBoolean()booleantrue/false布爾決策
nextFloat()float0.0 ~ 1.0浮點比例
nextDouble()double0.0 ~ 1.0高精度比例
nextGaussian()double正態分佈 μ=0,σ=1模擬自然現象

進階技巧:指定範圍隨機數

1. [0, n) 區間整數 —— 推薦用法

// 生成 0-9 之間的整數
int n = random.nextInt(10);  // 內部處理了負數與均勻分佈問題

原理:nextInt(bound) 使用拒絕採樣避免取模偏差,性能優於手動 Math.abs(random.nextInt() % n)。

2. [min, max] 閉區間整數

// 生成 10-20 之間的整數(含邊界)
int min = 10, max = 20;
int result = random.nextInt(max - min + 1) + min;

3. 浮點數範圍控制

// 生成 [5.0, 10.0) 區間雙精度浮點數
double result = 5.0 + random.nextDouble() * 5.0;

常見誤區與最佳實踐

  • ❌ 錯誤:Math.abs(random.nextInt() % 10) — 當 nextInt() 返回 Integer.MIN_VALUE 時 Math.abs 仍為負數,且取模導致分佈不均。
  • ✅ 正確:直接使用 random.nextInt(10)。
  • 線程爭用:高併發場景下共享 Random 實例會導致 CAS 競爭,建議使用 ThreadLocalRandom (Java 7+) 或每線程獨享實例。
  • 種子安全:不要在安全敏感場景(Token、Session ID)使用 Random,必須改用 SecureRandom。

Java 8+ 新增便利方法

// 生成無限流,取前 5 個 0-100 隨機數
IntStream ints = random.ints(5, 0, 101);  // [0, 101)
ints.forEach(System.out::println);

// 並行生成大量隨機數
double[] doubles = random.doubles(1_000_000, 0.0, 1.0).toArray();

總結

掌握 Random 的種子特性與 nextInt(bound) 範圍方法,即可覆蓋 90% 以上的業務隨機需求。記住:指定範圍用帶參數版本,並發用 ThreadLocalRandom,安全用 SecureRandom。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved