java.util.Random 是 Java 標準庫中生成偽隨機數的基礎工具類。理解其種子機制與生成原理,對於編寫可重現的測試案例、遊戲邏輯或加密應用至關重要。
以下程式碼演示了 Random 最核心的特性:相同種子 + 相同調用順序 = 完全相同的輸出序列。
import java.util.Random;
public class SeedDemo {
public static void main(String[] args) {
// 兩個實例使用相同種子 100
Random random1 = new Random(100);
Random random2 = new Random(100);
// 依序呼叫相同方法
System.out.println("--- random1 ---");
printSequence(random1);
System.out.println("\n--- random2 ---");
printSequence(random2);
}
static void printSequence(Random r) {
System.out.println(r.nextInt());
System.out.println(r.nextInt());
System.out.println(r.nextFloat());
System.out.println(r.nextFloat());
System.out.println(r.nextBoolean());
System.out.println(r.nextBoolean());
}
}
輸出結果:
-1193959466
-1139614796
0.19497603
0.7158033
true
false
-1193959466
-1139614796
0.19497603
0.7158033
true
false
這證明了 Random 內部採用線性同餘法(LCG),種子固定意味著整個狀態機初始狀態固定,後續輸出完全可預測。
常見需求是生成 [0, n) 區間的整數。正確做法結合 Math.abs() 與取模運算:
import java.util.Random;
public class RangeDemo {
public static void main(String[] args) {
Random random = new Random(); // 使用系統時間作種子
for (int i = 0; i < 20; i++) {
// 正確:範圍 0~99
int val = Math.abs(random.nextInt()) % 100;
System.out.print(val + " ");
}
}
}
Math.abs(),nextInt() 可能返回負數,導致取模結果為負數(範圍變成 -99 ~ 99)。
Random,減少線程爭用。Random 為偽隨機,種子固定則序列固定,利於測試復現。Math.abs(random.nextInt()) % n 獲取 [0, n-1]。ThreadLocalRandom 或 SecureRandom。