Java随机数生成器完全指南:从Random到SecureRandom的实用技巧与代码示例
今天我们将探讨如何在Java中生成随机数。在Java程序开发中,我们经常需要生成随机数。例如,在掷骰子游戏中模拟随机结果,或者为了加密目的生成一个随机密钥ID等场景。
Java中的随机数生成器

- java.util.Random类:可以用于生成随机数。它提供了多种方法来生成随机整数、长整数、双精度浮点数等。
- Math.random()方法:我们还可以使用Math.random()来生成一个双精度浮点数。这个方法在内部使用了Java Random类。
- java.util.concurrent.ThreadLocalRandom类:在多线程环境中应该使用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. 生成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. 生成随机双精度浮点数
我们可以在Java中使用Math.random()或Random类的nextDouble方法生成随机双精度浮点数。
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)); // 示例输出 [-70, -57, 74, 99, -78]
8. 多线程环境下的ThreadLocalRandom
以下是一个简单的示例,展示了在多线程环境中使用ThreadLocalRandom。
package com.Olivia.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 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代码库下载示例代码。