Stream.generate需配合Random或ThreadLocalRandom使用,推荐ThreadLocalRandom以保证线程安全与性能;可生成指定范围的int/double/long随机流,避免每次new Random(),固定种子场景可用预创建Random实例。

Stream.generate 本身不生成随机数,它需要你提供一个 Supplier<T> 来反复产出元素。要生成随机数流,得把 Random(或 ThreadLocalRandom)和 generate 配合使用。
用 ThreadLocalRandom 生成 int 流
推荐优先使用 ThreadLocalRandom,它是线程安全、轻量且专为并发场景优化的随机数生成器。
- 生成无限随机 int 流(默认范围:Integer.MIN_VALUE 到 Integer.MAX_VALUE):
Stream<Integer> randomInts = Stream.generate(() -> ThreadLocalRandom.current().nextInt()); - 生成 [0, 100) 范围内的随机 int:
Stream<Integer> ints0To99 = Stream.generate(() -> ThreadLocalRandom.current().nextInt(0, 100)); - 取前 10 个并收集为列表:
List<Integer> tenRandoms = Stream.generate(() -> ThreadLocalRandom.current().nextInt(1, 7))
.limit(10)
.toList(); // Java 16+
生成 double 或 long 随机流
直接调用对应方法即可,语义清晰:
- 随机 double([0.0, 1.0)):
Stream<Double> doubles = Stream.generate(() -> ThreadLocalRandom.current().nextDouble()); - 指定范围的 double(如 [5.0, 15.0)):
Stream<Double> rangeDoubles = Stream.generate(() -> ThreadLocalRandom.current().nextDouble(5.0, 15.0)); - 随机 long:
Stream<Long> longs = Stream.generate(() -> ThreadLocalRandom.current().nextLong());
注意:避免重复创建 Random 实例
不要在 Supplier 里每次 new Random(),否则可能因种子相同导致重复序列(尤其在快速调用时):
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误写法(低效且可能不随机):
Stream.generate(() -> new Random().nextInt()) - ✅ 正确做法是复用 ThreadLocalRandom.current(),它内部已做线程隔离与初始化优化
如果真要用 Random 实例(例如需固定种子)
可以提前创建好实例,并确保它是线程安全的用法(如单线程场景,或用 synchronized 包裹——但通常没必要):
- 固定种子、可复现的随机流:
Random fixedRandom = new Random(42L);
Stream<Integer> reproducible = Stream.generate(() -> fixedRandom.nextInt(100)); - 这种写法适合测试或需要确定性输出的场景


















