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

相关推荐
Dimpels几秒前
CANN ops-nn 算子解读:AIGC 批量生成中的 Batch 处理与并行算子
开发语言·aigc·batch
blueSatchel10 分钟前
U-Boot载入到DDR过程的代码分析
linux·开发语言·u-boot
专注VB编程开发20年12 分钟前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
(>_<)15 分钟前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农15 分钟前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
无小道19 分钟前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
Coder_Boy_31 分钟前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
踢足球092938 分钟前
寒假打卡:2026-2-7
java·开发语言·javascript
闻哥41 分钟前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
金牌归来发现妻女流落街头43 分钟前
【Springboot基础开发】
java·spring boot·后端