| 方法 | 回傳範圍/類型 | 說明 |
nextInt() | int (全範圍) | 含負數,均勻分佈 |
nextInt(int bound) | int [0, bound) | 最常用,產生 0 到 bound-1 的整數 |
nextLong() | long | 長整數 |
nextDouble() | double [0.0, 1.0) | 浮點數 |
nextFloat() | float [0.0, 1.0) | 單精度浮點數 |
nextBoolean() | boolean | true/false 機率各 50% |
nextGaussian() | double | 高斯分佈 (平均 0,標準差 1) |
nextBytes(byte[] buf) | void | 填充位元組陣列 |
實戰範例:從基礎到進階
1. 基礎:產生 20 個 0-9 的隨機整數
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random rand = new Random(); // 隨機種子
for (int i = 0; i < 20; i++) {
int num = rand.nextInt(10); // [0, 10)
System.out.printf("第 %2d 個隨機數:%d%n", i + 1, num);
}
}
}
2. 進階:指定範圍 [min, max] 的隨機整數
public static int randomInRange(Random rand, int min, int max) {
if (min > max) throw new IllegalArgumentException("min > max");
return rand.nextInt(max - min + 1) + min; // 含邊界
}
// 用法
int score = randomInRange(new Random(), 60, 100); // 模擬考試分數 60-100
3. 實用:洗牌演算法
public static void shuffleArray(int[] arr, Random rand) {
for (int i = arr.length - 1; i > 0; i--) {
int j = rand.nextInt(i + 1); // [0, i]
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
4. 種子固定:可重現的隨機測試
Random r1 = new Random(12345L);
Random r2 = new Random(12345L);
System.out.println(r1.nextInt(100) == r2.nextInt(100)); // true,序列完全相同
效能與線程安全
- 非線程安全:多執行緒共用同一
Random 實例會導致 CAS 競爭,效能下降。
- 高併發替代方案:
ThreadLocalRandom.current() (JDK 7+):執行緒本地隨機數,零競爭,首選。
SplittableRandom (JDK 8+):支援分割/並行流運算。
安全性警示 ⚠️
Random 不可用於加密場景(密碼、Token、Session ID),因種子可預測導致序列可推導。請改用:
// 強隨機數生成器
SecureRandom secureRandom = new SecureRandom();
byte[] token = new byte[32];
secureRandom.nextBytes(token); // 256-bit 安全隨機位元組
總結
- 日常開發:
new Random() + nextInt(bound) 覆蓋 90% 需求。
- 多執行緒:改用
ThreadLocalRandom。
- 需重現:固定
seed。
- 加密用途:嚴禁使用
Random,必須用 SecureRandom。
- 上一篇文章: Java 大檔案高效讀寫:MappedByteBuffer 記憶體映射完全指南
- 下一篇文章: Java FileWriter 寫入文字檔完整指南:緩衝、編碼與資源管理最佳實踐
Copyright ©
程式碼之家 All Rights Reserved