| 方法 | 返回範圍 | 說明 |
nextBoolean() | true/false | 等概率 50% |
nextDouble() | [0.0, 1.0) | 均勻分布雙精度小數 |
nextInt() | [-2³¹, 2³¹-1] | 全 int 範圍 |
nextInt(int n) | [0, n) | 指定上界(不含 n) |
setSeed(long seed) | void | 重置種子,等同新建實例 |
區間隨機數生成公式大全
基於 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 平行流。
實戰速查表
| 需求 | 推薦寫法 |
| 布林值 | 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) |
- 上一篇文章: Java 集合框架核心解析:List、Set 與 Map 完全指南
- 下一篇文章: Java 時間日期處理全攻略:Date、Calendar 與實戰案例
Copyright ©
程式碼之家 All Rights Reserved