今天我們將看看如何在Java中生成隨機數。有時我們需要在Java程序中生成隨機數。例如,骰子遊戲或為加密生成隨機密鑰等。
Java中的隨機數生成器
在java中生成隨機數的方法有很多種。
- java.util.Random類可用於創建隨機數。它提供了幾種方法來生成隨機整數、長整型、雙精度等。
- 我們也可以使用Math.random()生成雙精度數。該方法內部使用Java Random類。
java.util.concurrent.ThreadLocalRandom
類應該用於在多線程環境中生成隨機數。這個類是Java並發包的一部分,並在Java 1.7中引入。該類具有與Java Random類類似的方法。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