288. Java Stream API - 创建随机数的 Stream

文章目录

  • [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() 将原始类型流 IntStreamDoubleStream 装箱为对象流

🎯 应用场景小脑图

java 复制代码
        [ 随机数 Stream ]
               |
    +----------+-----------+
    |                      |
 [生成测试数据]       [模拟事件]
                          |
       +------------------+------------------+
       |                                     |
 [布尔概率]                        [权重选择(如 A/B/C)]

🎓 小测验(课堂互动)

问题: 使用 random.ints(5, 10, 20) 会生成哪些数字?

✅ A. 10 到 20(包含 20)

❌ B. 10 到 19(不含 20)

✅ 正确答案:B

相关推荐
无限进步_4 小时前
面试题 02.02. 返回倒数第 k 个节点 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio
夕除4 小时前
js--7
java
布谷歌4 小时前
面试题整理
java·开发语言
爬山算法4 小时前
Hibernate(74)如何在CQRS架构中使用Hibernate?
java·架构·hibernate
j445566114 小时前
C++中的职责链模式高级应用
开发语言·c++·算法
Hello World . .4 小时前
数据结构:栈和队列
c语言·开发语言·数据结构·vim
jjjava2.04 小时前
深入解析Set与Map的奥秘
java·开发语言
白宇横流学长4 小时前
基于Java的火车票订票系统的设计与开发
java·开发语言
黎雁·泠崖4 小时前
Java核心基础API学习总结:从Object到包装类的核心知识体系
java·开发语言·学习
Yvonne爱编码4 小时前
JAVA数据结构 DAY1-集合和时空复杂度
java·数据结构·python