在Java中的隨機數生成器

今天我們將看看如何在Java中生成隨機數。有時我們需要在Java程序中生成隨機數。例如,骰子遊戲或為加密生成隨機密鑰等。

Java中的隨機數生成器

在java中生成隨機數的方法有很多種。

  1. java.util.Random類可用於創建隨機數。它提供了幾種方法來生成隨機整數、長整型、雙精度等。
  2. 我們也可以使用Math.random()生成雙精度數。該方法內部使用Java Random類。
  3. java.util.concurrent.ThreadLocalRandom類應該用於在多線程環境中生成隨機數。這個類是Java並發包的一部分,並在Java 1.7中引入。該類具有與Java Random類類似的方法。
  4. java.security.SecureRandom可用於生成具有強大安全性的隨機數。該類提供了一個具有密碼學強度的隨機數生成器。然而,它在處理上速度較慢。因此,根據您的應用要求,您應該決定是否使用它。

Java 隨機數生成器

讓我們看一些在 Java 中生成隨機數的示例。稍後,我們還將查看 ThreadLocalRandom 和 SecureRandom 的示例程序。

1. 生成隨機整數

Random random = new Random();

int rand = random.nextInt();

是的,在 Java 中生成隨機整數就是這麼簡單。當我們創建 Random 實例時,它會生成一個長整型種子值,該值用於所有 nextXXX 方法調用中。我們可以在程序中設置此種子值,但在大多數情況下並不需要。

//使用 Random 構造函數設置長整型種子值
Random random = new Random(123456789);

//使用 setter 方法設置長整型種子值
Random random1 = new Random();
random1.setSeed(1234567890);

2. Java 1 到 10 之間的隨機數

有時我們需要在一個範圍內生成隨機數。例如,在骰子遊戲中,可能值只能在 1 到 6 之間。以下是示範如何生成介於 1 到 10 之間的隨機數的代碼。

Random random = new Random();
int rand = 0;
while (true){
    rand = random.nextInt(11);
    if(rand !=0) break;
}
System.out.println(rand);

參數 nextInt(int x) 是排除在外的,所以我們必須提供 11 作為參數。此外,生成的隨機數中包括 0,因此我們必須不斷調用 nextInt 方法,直到獲得介於 1 和 10 之間的值。您可以擴展上面的代碼以在任何給定範圍內生成隨機數。

3. 生成隨機 double

我們可以使用 Math.random() 或 Random 類的 nextDouble 方法在 Java 中生成隨機 double 數。

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. 生成隨機 float

Random random = new Random();

float f = random.nextFloat();

5. 生成隨機 long

Random random = new Random();

long l = random.nextLong();

6. 生成隨機 boolean

Random random = new Random();

boolean flag = random.nextBoolean();

7. 生成隨機位元組陣列

我們可以使用 Random 類別生成隨機位元組並將它們放入使用者提供的位元組陣列中。生成的隨機位元組數量等於位元組陣列的長度。

Random random = new Random();

byte[] randomByteArray = new byte[5];

random.nextBytes(randomByteArray);

System.out.println(Arrays.toString(randomByteArray)); // sample output [-70, -57, 74, 99, -78]

8. 多執行緒環境中的 ThreadLocalRandom

以下是一個簡單的示例,展示了在多執行緒環境中使用 ThreadLocalRandom 的情況。

package com.journaldev.randomnumber;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {

	public static void main(String[] args) {
		Runnable runnable = new MyRunnable();

		for (int i = 0; i < 5; i++) {
			Thread t = new Thread(runnable);
			t.setName("MyRunnable-Thread-" + i);
			t.start();
		}
	}

}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		System.out.println(threadName + "::" + ThreadLocalRandom.current().nextInt());
	}

}

以下是我執行上述程式的範例輸出。

MyRunnable-Thread-0::-1744088963
MyRunnable-Thread-3::139405798
MyRunnable-Thread-1::1403710182
MyRunnable-Thread-2::-1222080205
MyRunnable-Thread-4::-185825276

我們無法為 ThreadLocalRandom 實例設置種子值,否則將拋出 UnsupportedOperationException ThreadLocalRandom 類別還具有一些額外的實用方法來生成指定範圍內的隨機數。例如,要生成介於1和10之間的隨機數,可以像下面這樣做。

ThreadLocalRandom random = ThreadLocalRandom.current();
		
int rand = random.nextInt(1, 11);

ThreadLocalRandom 還有類似的方法來生成隨機的 long 和 double 值。

9. SecureRandom 範例

您可以使用SecureRandom類來使用任何列出的提供者生成更安全的隨機數。下面是一個快速的SecureRandom示例代碼。

Random random = new SecureRandom();

int rand = random.nextInt();

System.out.println(rand);

這就是在Java程序中生成隨機數的所有內容。

您可以從我們的GitHub存儲庫下載示例代碼。

Source:
https://www.digitalocean.com/community/tutorials/random-number-generator-java