文章目录
- [288. Java Stream API - 创建随机数的 Stream](#288. Java Stream API - 创建随机数的 Stream)
-
-
- [✅ 核心概念](#✅ 核心概念)
- [📌 示例 1:生成 10 个介于 1 到 5(不含 5)之间的随机整数](#📌 示例 1:生成 10 个介于 1 到 5(不含 5)之间的随机整数)
- [📌 示例 2:生成布尔值流(80% 概率为 true)](#📌 示例 2:生成布尔值流(80% 概率为 true))
- [📌 示例 3:生成带权重概率的字符串流(A、B、C、D)](#📌 示例 3:生成带权重概率的字符串流(A、B、C、D))
- [📘 补充说明:`Random` 相关知识点](#📘 补充说明:
Random相关知识点) - [🎯 应用场景小脑图](#🎯 应用场景小脑图)
- [🎓 小测验(课堂互动)](#🎓 小测验(课堂互动))
-
288. Java Stream API - 创建随机数的 Stream
✅ 核心概念
Java 8 开始,java.util.Random 类新增了生成 Stream 随机数序列 的方法:
ints()longs()doubles()
这些方法都能:
- 生成固定数量的随机数
- 设定数值上下限
- 使用
boxed()装箱为对象类型(如Stream<Integer>)
📌 示例 1:生成 10 个介于 1 到 5(不含 5)之间的随机整数
java
Random random = new Random(314L);
List<Integer> randomInts =
random.ints(10, 1, 5) // 生成 10 个 1~4 之间的随机整数
.boxed()
.toList();
System.out.println("randomInts = " + randomInts);
🧾 输出:
java
randomInts = [3, 3, 3, 2, 1, 2, 2, 3, 1, 3]
🎯 注意事项:
- 指定种子
new Random(314L)让结果可重复 .boxed():将IntStream转为Stream<Integer>,可用于集合收集ints(count, minInclusive, maxExclusive):上限不包括!
📌 示例 2:生成布尔值流(80% 概率为 true)
java
Random random = new Random(314L);
List<Boolean> booleans =
random.doubles(1_000, 0d, 1d) // 1000 个 0.0~1.0 的随机浮点数
.mapToObj(rand -> rand <= 0.8) // 80% 概率为 true
.toList();
long numberOfTrue =
booleans.stream()
.filter(b -> b)
.count();
System.out.println("Number of true = " + numberOfTrue);
📌 输出(使用种子 314L):
java
Number of true = 773
🧠 应用场景:
- 模拟带有概率分布的事件
- 常用于测试、机器学习数据生成等
📌 示例 3:生成带权重概率的字符串流(A、B、C、D)
java
Random random = new Random(314L);
List<String> letters =
random.doubles(1_000, 0d, 1d)
.mapToObj(rand ->
rand < 0.5 ? "A" : // 50%
rand < 0.8 ? "B" : // +30%
rand < 0.9 ? "C" : // +10%
"D") // 剩下 10%
.toList();
Map<String, Long> map =
letters.stream()
.collect(Collectors.groupingBy(
Function.identity(), Collectors.counting()));
map.forEach((letter, number) ->
System.out.println(letter + " :: " + number));
📌 控制台输出:
java
A :: 470
B :: 303
C :: 117
D :: 110
📊 小结:
- 通过随机数和区间划分控制概率
Collectors.groupingBy(...)用于统计频次
📘 补充说明:Random 相关知识点
| 方法 | 说明 |
|---|---|
ints(n, min, max) |
生成 n 个 [min, max) 的整数流 |
doubles(n, 0d, 1d) |
常用于概率模拟 |
boxed() |
将原始类型流 IntStream、DoubleStream 装箱为对象流 |
🎯 应用场景小脑图
java
[ 随机数 Stream ]
|
+----------+-----------+
| |
[生成测试数据] [模拟事件]
|
+------------------+------------------+
| |
[布尔概率] [权重选择(如 A/B/C)]
🎓 小测验(课堂互动)
问题: 使用 random.ints(5, 10, 20) 会生成哪些数字?
✅ A. 10 到 20(包含 20)
❌ B. 10 到 19(不含 20)
✅ 正确答案:B