Java Random
类详解
Java 提供了 java.util.Random
类用于生成伪随机数。它是基于随机种子(seed)生成伪随机数序列的工具,广泛应用于游戏开发、模拟、算法测试等领域。
Random
类的特性
-
伪随机数:
Random
生成的数是伪随机数,依赖于内部的随机种子。- 给定相同的种子,每次生成的随机数序列相同。
-
支持多种类型随机数:
- 支持生成
int
、long
、float
、double
、boolean
等类型的随机数。
- 支持生成
-
线程安全性:
Random
是线程安全的,但如果多个线程频繁调用可能会导致性能瓶颈(推荐使用ThreadLocalRandom
)。
-
种子控制:
- 可以通过自定义种子生成可预测的随机数序列,便于测试和调试。
构造方法
1. Random()
- 默认构造函数。
- 使用当前时间作为种子。
2. Random(long seed)
- 使用指定的种子初始化随机数生成器。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
// 使用默认种子
Random random1 = new Random();
System.out.println(random1.nextInt());
// 使用指定种子
Random random2 = new Random(12345);
System.out.println(random2.nextInt());
}
}
常用方法
1. nextInt()
- 生成一个伪随机的
int
类型数值。 - 范围:
Integer.MIN_VALUE
到Integer.MAX_VALUE
。
Random random = new Random();
int randomInt = random.nextInt();
System.out.println(randomInt); // 输出一个随机整数
2. nextInt(int bound)
- 生成一个伪随机的
int
类型数值,范围为[0, bound)
。 - 参数
bound
必须为正整数,否则抛出IllegalArgumentException
。
Random random = new Random();
int randomInt = random.nextInt(10); // 生成 0 到 9 之间的随机数
System.out.println(randomInt);
3. nextDouble()
- 生成一个伪随机的
double
类型数值。 - 范围:
[0.0, 1.0)
。
Random random = new Random();
double randomDouble = random.nextDouble();
System.out.println(randomDouble); // 输出 0.0 到 1.0 之间的随机数
4. nextFloat()
- 生成一个伪随机的
float
类型数值。 - 范围:
[0.0, 1.0)
。
Random random = new Random();
float randomFloat = random.nextFloat();
System.out.println(randomFloat);
5. nextBoolean()
- 生成一个伪随机的布尔值(
true
或false
)。
Random random = new Random();
boolean randomBoolean = random.nextBoolean();
System.out.println(randomBoolean); // 输出 true 或 false
6. nextLong()
- 生成一个伪随机的
long
类型数值。 - 范围:
Long.MIN_VALUE
到Long.MAX_VALUE
。
Random random = new Random();
long randomLong = random.nextLong();
System.out.println(randomLong); // 输出一个随机长整型数
7. nextBytes(byte[] bytes)
- 填充一个字节数组,使其每个字节都是随机值。
Random random = new Random();
byte[] byteArray = new byte[5];
random.nextBytes(byteArray);
System.out.println(Arrays.toString(byteArray)); // 输出随机字节数组
8. setSeed(long seed)
- 设置随机数生成器的种子。
- 重置种子后,随机数序列将重新生成。
Random random = new Random();
random.setSeed(12345);
System.out.println(random.nextInt()); // 输出固定的随机数序列
示例应用
1. 模拟掷骰子
import java.util.Random;
public class DiceRoll {
public static void main(String[] args) {
Random random = new Random();
int diceRoll = random.nextInt(6) + 1; // 生成 1 到 6 的随机数
System.out.println("You rolled: " + diceRoll);
}
}
2. 随机密码生成器
import java.util.Random;
public class PasswordGenerator {
public static void main(String[] args) {
Random random = new Random();
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder password = new StringBuilder();
for (int i = 0; i < 8; i++) { // 生成8位密码
int index = random.nextInt(characters.length());
password.append(characters.charAt(index));
}
System.out.println("Generated password: " + password);
}
}
3. 抽奖程序
import java.util.Random;
public class Lottery {
public static void main(String[] args) {
Random random = new Random();
int[] lotteryNumbers = new int[5];
for (int i = 0; i < 5; i++) {
lotteryNumbers[i] = random.nextInt(50) + 1; // 1 到 50 的随机数
}
System.out.println("Lottery numbers: " + Arrays.toString(lotteryNumbers));
}
}
注意事项
-
伪随机数的性质:
Random
生成的随机数是伪随机数,并不真正随机。- 对于高安全性需求(如密码生成),推荐使用
java.security.SecureRandom
。
-
多线程环境:
Random
是线程安全的,但高并发下推荐使用ThreadLocalRandom
。
-
种子控制:
- 相同的种子会生成相同的随机数序列,因此在测试和调试中很有用。
与 ThreadLocalRandom
的比较
-
Random
:- 适合单线程环境。
- 每次调用共享同一个实例,可能导致竞争。
-
ThreadLocalRandom
:- 适合多线程环境。
- 每个线程独立实例,性能更高。
示例:
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomExample {
public static void main(String[] args) {
int randomInt = ThreadLocalRandom.current().nextInt(1, 101); // 1 到 100 的随机数
System.out.println(randomInt);
}
}
总结
-
Random
的优势:- 易用,适合大多数单线程随机数生成需求。
- 支持多种类型的随机数(
int
、double
、boolean
等)。
-
注意种子的使用:
- 相同种子可生成相同随机数序列。
- 对于安全性需求,请使用
SecureRandom
。
-
多线程推荐:
- 使用
ThreadLocalRandom
,以提高并发性能。
- 使用
通过灵活使用 Random
,可以轻松实现各种随机化功能,从游戏到模拟,再到数据分析。