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

相关推荐
love_muming2 分钟前
Java编程核心技巧全解析
java·开发语言·idea
爱编程的小新☆3 分钟前
Spring-AI入门
java·后端·spring
wjm0410068 分钟前
简单谈谈ios开发中的UI
开发语言·ios·swift
用户298698530149 分钟前
Java 获取 Word 文档中修订记录的实现方法
java·后端
Dicky-_-zhang9 分钟前
Redis集群模式详解与实战配置
java·jvm
你的保护色10 分钟前
ensp之STP、RSTP、MSTP协议实验
java·服务器·数据库
slandarer12 分钟前
MATLAB | 土地利用变化桑基图及状态转移桑基图绘制
开发语言·数学建模·matlab·桑基图
L_090722 分钟前
【C++】面向对象三大特性之多态
开发语言·c++
JAVA学习通24 分钟前
《大营销平台系统设计实现》 - 营销服务 第5节:抽奖前置规则过滤
java·数据库·github
threelab24 分钟前
Three.js 银河星系效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能