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

Java Random 類完整指南:隨機數生成、區間控制與概率實現

     編輯:Java 相關知識

Random 類核心機制

java.util.Random 實現的是偽隨機算法:以種子為起點,按確定規則產生序列。相同種子、相同調用次數產生的序列完全一致。這在測試復現、加密場景極重要,但多實例並發時需注意避免種子碰撞。

構造方法

  • Random():以系統納秒時間為種子(System.nanoTime()),最常用。
  • Random(long seed):指定種子,用於可復現測試。

核心方法詳解

區間隨機數生成公式大全

基於 Random r = new Random();

浮點數區間

[0, 1.0)        → r.nextDouble()
[0, 5.0)        → r.nextDouble() * 5
[1, 2.5)        → r.nextDouble() * 1.5 + 1
[d1, d2)        → r.nextDouble() * (d2 - d1) + d1

整數區間

任意整數        → r.nextInt()
[0, 10)         → r.nextInt(10)              // 推薦
[0, 10]         → r.nextInt(11)              // 含上界轉半開區間
[-3, 15)        → r.nextInt(18) - 3          // 寬度 18 偏移 -3
[a, b]          → r.nextInt(b - a + 1) + a   // 通用公式

概率邏輯實現

利用 nextInt(100) 產生 [0,99] 共 100 個等概率整數,每個佔 1%。

範例:55% 返回 1,40% 返回 2,5% 返回 3

int n = r.nextInt(100);
int result;
if (n < 55) result = 1;           // [0,54] 55 個數
else if (n < 95) result = 2;      // [55,94] 40 個數
else result = 3;                  // [95,99] 5 個數

優化:公約數簡化

概率皆為 5% 倍數 → 用 nextInt(20)(每格 5%)

int n = r.nextInt(20);
if (n < 11) result = 1;           // 0-10 共 11 格 = 55%
else if (n < 19) result = 2;      // 11-18 共 8 格 = 40%
else result = 3;                  // 19 共 1 格 = 5%

常見陷阱與最佳實踐

1. 多實例同種子問題

// 錯誤:兩實例種子相同,產生完全相同序列
Random r1 = new Random(10);
Random r2 = new Random(10);
for (int i = 0; i < 2; i++) {
    System.out.println(r1.nextInt() + " == " + r2.nextInt()); // 全相等
}

// 正確:全局共用單實例
private static final Random RANDOM = new Random();
// 或 ThreadLocalRandom.current() (JDK 7+,多線程更高效)

2. Math.random() 關係

Math.random() 內部調用 Random.nextDouble(),本質相同。Math.random() 無參調用簡單,但無法指定種子、無法生成整數區間,靈活性較差。

3. 線程安全替代方案

  • ThreadLocalRandom (JDK 7+):每線程獨立實例,無競爭,性能最優。
  • SecureRandom:加密級強隨機,種子來自熵池,適用 Token、Session ID、加密金鑰生成。
  • SplittableRandom (JDK 8+):可分裂,適合 Fork/Join 平行流。

實戰速查表

方法返回範圍說明
nextBoolean()true/false等概率 50%
nextDouble()[0.0, 1.0)均勻分布雙精度小數
nextInt()[-2³¹, 2³¹-1]全 int 範圍
nextInt(int n)[0, n)指定上界(不含 n)
setSeed(long seed)void重置種子,等同新建實例
需求推薦寫法
布林值r.nextBoolean()
[0,1) 小數r.nextDouble()
[0,n) 整數r.nextInt(n)
[a,b] 整數r.nextInt(b - a + 1) + a
加權概率按權重累加區間映射
多線程高併發ThreadLocalRandom.current().nextInt(n)
安全敏感場景new SecureRandom().nextInt(n)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved