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

相关推荐
keep one's resolveY11 分钟前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克31 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
Gary Studio1 小时前
安卓HAL C++基础-智能指针
开发语言·c++
啧不应该啊1 小时前
Day1 Python 与 C 的类型区别
c语言·开发语言
摇滚侠2 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌2 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局2 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
cen__y2 小时前
Linux07(信号01)
linux·运维·服务器·c语言·开发语言
阿丰资源2 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
xingpanvip2 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua