java随机数介绍以及生成随机日期

生成一个随机日期

1
2
3
4
5
6
7
8
9
10
11
public static Date randomTime(Date startTime, Date endTime) {
// 获取时间区间的起始毫秒值和结束毫秒值
long startMillis = startTime.getTime();
long endMillis = endTime.getTime();

// 使用 ThreadLocalRandom 在区间内生成一个随机的毫秒值
long randomMillis = ThreadLocalRandom.current().nextLong(startMillis, endMillis);

// 返回一个新的随机时间
return new Date(randomMillis);
}

工具类比较简单,这里就不多介绍了,这篇文章主要介绍一下java生成随机数的API

JAVA生成随机数API

1. java.util.Random

Random 是 Java 中最常用的随机数生成器,属于伪随机数生成器(PRNG)。Random 提供了一系列方法来生成不同类型的随机数。

1
2
3
4
5
6
7

Random random = new Random();
int randomInt = random.nextInt(); // 生成随机整数
int randomIntInRange = random.nextInt(100); // 生成 0 到 99 之间的随机整数
long randomLong = random.nextLong(); // 生成随机长整数
double randomDouble = random.nextDouble(); // 生成 0.0 到 1.0 之间的随机小数

2. java.util.concurrent.ThreadLocalRandom

ThreadLocalRandomRandom 的线程安全版本,适合在多线程环境中使用。它的性能更好,因为它为每个线程创建一个独立的随机数生成器。

1
2
3
4
5
6
7

ThreadLocalRandom random = ThreadLocalRandom.current();
int randomInt = random.nextInt(); // 生成随机整数
int randomIntInRange = random.nextInt(100); // 生成 0 到 99 之间的随机整数
long randomLong = random.nextLong(); // 生成随机长整数
double randomDouble = random.nextDouble(); // 生成 0.0 到 1.0 之间的随机小数

3. java.security.SecureRandom

SecureRandom 是专门设计用于生成加密强度的随机数。它比 Random 更安全,因为它使用的是加密算法生成的随机数,适合需要高安全性的场景,例如生成加密密钥、会话标识符等

1
2
3
4
5
6
7

SecureRandom secureRandom = new SecureRandom();
int randomInt = secureRandom.nextInt(); // 生成随机整数
int randomIntInRange = secureRandom.nextInt(100); // 生成 0 到 99 之间的随机整数
byte[] bytes = new byte[16];
secureRandom.nextBytes(bytes); // 生成随机字节数组

4. Math.random()

Math.random() 是 Java 中生成 0.0 到 1.0 之间的双精度浮点数的简便方法,它是 Random 类的一个简化接口。Math.random() 内部实际上使用的是 Random 类的实例。

1
2
3

double randomDouble = Math.random(); // 生成 0.0 到 1.0 之间的随机小数

5. java.util.Random#ints (Java 8+)

Java 8 开始,Random 类新增了一些流式 API,可以用来生成随机数流,这对于生成一组随机数非常有用。

1
2
3
4
5
6
7
8

Random random = new Random();
// 生成一个包含 5 个随机整数的流
random.ints(5).forEach(System.out::println);

// 生成指定范围内的随机整数流
random.ints(5, 0, 100).forEach(System.out::println);

总结

随机数生成器 特点 适用场景 性能
Random 伪随机数生成器,使用线性同余法,支持多种随机数类型生成。 普通单线程场景
ThreadLocalRandom 线程安全,性能优于 Random,适合多线程环境。 多线程场景
SecureRandom 安全性高,难以预测,适合加密、生成密钥等场景。 安全性要求高的场景(加密、认证等)
Math.random() 简单易用,只能生成 0.0 - 1.0double 随机数。 生成简单的随机小数
Random#ints (Java 8+) 支持流式生成随机数,适合生成多个随机数。 批量生成随机数

最后再说一下Hutool中的随机数API

Hutool 库中的 RandomUtil 提供了一系列生成随机数的方法,它基于 JDKThreadLocalRandom 实现,因此具备线程安全、性能高效的特性。在性能和使用便捷性上,RandomUtilJDK 原生的随机数生成工具相比,有一些优势,尤其是简化了常见的随机数生成操作。

1
2
3
4
5
6
// 用法很多,这里简单写几个
int randomInt = RandomUtil.randomInt(); // 生成一个随机整数
int randomIntInRange = RandomUtil.randomInt(100); // 生成 0 到 99 之间的随机整数
long randomLong = RandomUtil.randomLong(); // 生成随机长整数
String randomString = RandomUtil.randomString(10); // 生成指定长度的随机字符串

  • 用法很多,基本上我们常用的生成方式它都能提供
  • 使用简单,无需创建对象,直接调用
  • 不支持加密强度的随机数生成