在Java中生成随机数是非常常见的需求,标准库提供了多个类来满足不同场景。理解它们的特点和用法,可以让你写出更健壮的代码。

Java中常用的随机数生成类
Java主要提供以下三种随机数相关类:
- Random:基础伪随机数生成器,单线程下好用,多线程可能存在竞争。
- ThreadLocalRandom:JDK 7引入,适合多线程,性能更好。
- SecureRandom:基于算法的安全随机数,适合密码学场景。
使用Random生成随机数
Random类位于java.util包,通过nextInt、nextDouble等方法获取随机数。
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
// 创建随机数生成器
Random random = new Random();
// 生成0到9之间的整数
int num = random.nextInt(10);
System.out.println("随机整数: " + num);
// 生成0.0到1.0之间的小数
double d = random.nextDouble();
System.out.println("随机小数: " + d);
}
}
多线程下使用ThreadLocalRandom
在并发程序中,推荐使用ThreadLocalRandom避免多线程争用同一个Random实例。
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomDemo {
public static void main(String[] args) {
// 获取当前线程的随机数生成器
int num = ThreadLocalRandom.current().nextInt(1, 101);
System.out.println("1到100的随机整数: " + num);
}
}
安全随机数SecureRandom
当随机数用于令牌、密钥等安全用途时,应使用SecureRandom。
import java.security.SecureRandom;
public class SecureRandomDemo {
public static void main(String[] args) {
SecureRandom secureRandom = new SecureRandom();
byte[] bytes = new byte[16];
// 生成随机字节
secureRandom.nextBytes(bytes);
System.out.println("安全随机字节长度: " + bytes.length);
}
}
常见错误与注意点
错误一:重复创建Random实例
在循环中频繁new Random()可能导致随机性变差,应复用同一个实例或使用ThreadLocalRandom。
错误二:用随机数做唯一ID
随机数不能保证唯一,如果需要唯一标识,应结合UUID或数据库序列。
| 类 | 适用场景 | 是否线程安全 |
|---|---|---|
| Random | 普通单线程 | 否(共享时有竞争) |
| ThreadLocalRandom | 多线程高并发 | 是 |
| SecureRandom | 安全敏感 | 是 |
小结
在Java中使用随机数生成器时,普通场景用Random或ThreadLocalRandom,安全场景用SecureRandom。合理选择类并避免常见错误,就能稳定高效地生成随机数。