Java 中的随机数生成器
今天我们将研究如何在 Java 中生成随机数。有时我们需要在 Java 程序中生成随机数。例如,骰子游戏或生成用于加密的随机密钥 ID 等。
Java 中的随机数生成器
在java中有很多种方法可以生成随机数。
- java.util.Random类可用于创建随机数。它提供了几种方法来生成随机整数、长整数、双精度数等。
- 我们还可以使用Math.random()来生成双精度数。此方法内部使用 Java Random 类。
java.util.concurrent.ThreadLocalRandom
类应该用于在多线程环境中生成随机数。该类是Java Concurrent包的一部分,在 Java 1.7 中引入。该类具有与 Java Random 类类似的方法。java.security.SecureRandom
可用于生成安全性高的随机数。此类提供加密性强的随机数生成器。但是,其处理速度较慢。因此,您应该根据应用程序要求来决定是否使用它。
Java 随机数生成器
让我们看一些在 Java 中生成随机数的示例。稍后,我们还将查看 ThreadLocalRandom 和 SecureRandom 示例程序。
1. 生成随机整数
Random random = new Random();
int rand = random.nextInt();
是的,在 Java 中生成随机整数就是这么简单。当我们创建 Random 实例时,它会生成一个长种子值,该值用于所有方法nextXXX
调用。我们可以在程序中设置这个种子值,但大多数情况下不需要。
//set the long seed value using Random constructor
Random random = new Random(123456789);
//set long seed value using setter method
Random random1 = new Random();
random1.setSeed(1234567890);
2. Java 1 到 10 之间的随机数
有时我们必须生成一个介于某个范围内的随机数。例如,在骰子游戏中,可能的值只能在 1 到 6 之间。以下代码显示了如何生成介于 1 到 10 之间的随机数(含 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. 生成随机双精度浮点数
我们可以使用Math.random()
或 Random 类nextDouble
方法在 java 中生成随机双数。
Random random = new Random();
double d = random.nextDouble();
double d1 = Math.random();
4. 生成随机浮点数
Random random = new Random();
float f = random.nextFloat();
5. 生成随机数
Random random = new Random();
long l = random.nextLong();
6. 生成随机布尔值
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 具有类似的方法来生成随机的长整型值和双精度型值。
9. SecureRandom 示例
您可以使用 SecureRandom 类通过列出的任何提供程序生成更安全的随机数。下面给出了一个快速 SecureRandom 示例代码。
Random random = new SecureRandom();
int rand = random.nextInt();
System.out.println(rand);
这就是在 Java 程序中生成随机数的全部内容。
您可以从我们的GitHub 存储库下载示例代码。