Random 類是 Java 標準庫中生成偽隨機數的基礎工具,採用線性同餘算法,線程安全但非加密安全。若需密碼學級隨機數,請使用 SecureRandom。
// 默認構造:以 System.currentTimeMillis() 為種子
Random random = new Random();
// 等價於
Random random = new Random(System.currentTimeMillis());
// 指定種子:相同種子產生完全相同的序列,便於測試復現
Random random = new Random(10010010L);
關鍵結論:種子決定整個隨機序列。生產環境建議使用默認構造(時間種子),單元測試時固定種子以獲得確定性輸出。
| 方法 | 返回類型 | 範圍 | 典型用途 |
|---|---|---|---|
| nextInt() | int | -2^31 ~ 2^31-1 | 通用整數 |
| nextLong() | long | -2^63 ~ 2^63-1 | 長整數 ID |
| nextBoolean() | boolean | true/false | 布爾決策 |
| nextFloat() | float | 0.0 ~ 1.0 | 浮點比例 |
| nextDouble() | double | 0.0 ~ 1.0 | 高精度比例 |
| nextGaussian() | double | 正態分佈 μ=0,σ=1 | 模擬自然現象 |
// 生成 0-9 之間的整數
int n = random.nextInt(10); // 內部處理了負數與均勻分佈問題
原理:nextInt(bound) 使用拒絕採樣避免取模偏差,性能優於手動 Math.abs(random.nextInt() % n)。
// 生成 10-20 之間的整數(含邊界)
int min = 10, max = 20;
int result = random.nextInt(max - min + 1) + min;
// 生成 [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+) 或每線程獨享實例。Random,必須改用 SecureRandom。// 生成無限流,取前 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。