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

相关推荐
程序员清风14 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55115 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊20 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing20 小时前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家2 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺2 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602732 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端