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

Java Random 類用法詳解:產生偽隨機數的核心 API 與實戰技巧

     編輯:Java 程式設計入門

Random 類核心定位

java.util.Random 是 Java 標準庫中產生偽隨機數的基礎工具類。基於線性同餘演算法 (LCG),以種子決定數列,同種子產出相同序列,適用於模擬、測試、遊戲邏輯等非加密場景。

常用構造方法

  • new Random():以 System.nanoTime() 為種子,每次執行結果不同。
  • new Random(long seed):指定種子,便於重現結果(單元測試、除錯神器)。

核心實例方法速查表

實戰範例:從基礎到進階

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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法回傳範圍/類型說明
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()booleantrue/false 機率各 50%
nextGaussian()double高斯分佈 (平均 0,標準差 1)
nextBytes(byte[] buf)void填充位元組陣列