首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Random 類深度解析:隨機數生成與種子機制

     編輯:Java 相關知識

Java 隨機數生成核心機制

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)。

進階補充:ThreadLocalRandom 與 SecureRandom

  • ThreadLocalRandom(Java 7+):高併發環境下優於 Random,減少線程爭用。
  • SecureRandom:密碼學安全隨機數,適用於 Token、Session ID、加密金鑰生成。

總結

  1. Random 為偽隨機,種子固定則序列固定,利於測試復現。
  2. 範圍控制用 Math.abs(random.nextInt()) % n 獲取 [0, n-1]。
  3. 高併發或安全場景請改用 ThreadLocalRandom 或 SecureRandom。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved