Java java.util.Random 是一個偽隨機數生成器(PRNG)。其生成的序列完全由種子決定:相同種子產生相同序列。若不指定種子,構造函數會採用當前時間(System.nanoTime())作為種子。
Random 內部使用 48 位種子,採用線性同餘公式更新:
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
每次調用 next(bits) 時,先更新種子,再返回種子高位作為隨機數。因此:
for (int i = 0; i < 10; i++) {
Random r = new Random(10); // 每次重置種子為 10
int data = r.nextInt(10);
System.out.print(data + " ");
}
// 輸出:十個相同的數字
每次迭代創建新實例並重置種子,故每次 nextInt() 返回的都是種子 10 對應的第一個隨機數。
Random r = new Random(10); // 僅一次初始化
for (int i = 0; i < 10; i++) {
int data = r.nextInt(10);
System.out.print(data + " ");
}
// 輸出:十個不同的數字,構成固定序列
種子隨調用遞推更新,產生確定性序列。再次運行程序,輸出序列完全相同。
new Random()for (int i = 0; i < 10; i++) {
Random r = new Random(); // 種子 = System.nanoTime() + 某偏移
System.out.print(r.nextInt(10) + " ");
}
每次迭代種子不同(納秒級時間差),故輸出序列每次運行都不同。但若在極短時間內連續創建多個 Random,種子可能相同導致序列重複。
private static final Random RANDOM = new Random();,避免頻繁創建。java.security.SecureRandom(基於熵池)。new Random(12345L),保證測試數據確定性。Random 線程安全但有爭用;高併發建議用 ThreadLocalRandom(Java 7+)。Random 的「隨機」本質是確定性演算法 + 變化種子。理解種子與序列的對應關係,是正確使用偽隨機數的關鍵。生產環境中,根據安全性、性能、可重現性需求選擇合適的隨機數生成器。