网站首页 > java教程 正文
在创建伪随机数生成器的流之前,让我们先创建一个伪随机数的流。首先,让我们看看如何使用传统的Random、SecureRandom和ThreadLocalRandom来实现。由于这三个伪随机数生成器包含了如ints()返回IntStream、doubles()返回DoubleStream等方法,我们可以很容易地生成一个(无)限的伪随机数流,如下所示:
Random rnd = new Random();
// ints() 方法返回一个无限流
int[] arrOfInts = rnd.ints(10).toArray(); // 10个整数的流
// 或者,简写为
int[] arrOfInts = new Random().ints(10).toArray();
在我们的例子中,我们将生成的伪随机数收集到一个数组中。当然,你可以按自己的需求处理它们。我们可以通过SecureRandom获得类似的结果,如下所示:
SecureRandom secureRnd = SecureRandom.getInstanceStrong();
int[] arrOfSecInts = secureRnd.ints(10).toArray();
// 或者,简写为
int[] arrOfSecInts = SecureRandom.getInstanceStrong().ints(10).toArray();
那么ThreadLocalRandom呢?这里有一个例子:
ThreadLocalRandom tlRnd = ThreadLocalRandom.current();
int[] arrOfTlInts = tlRnd.ints(10).toArray();
// 或者,简写为
int[] arrOfTlInts = ThreadLocalRandom.current().ints(10).toArray();
如果你只需要一个0.0到1.0之间的double数流,那么可以依赖Math.random(),它内部使用了java.util.Random的一个实例。以下示例收集了一个0.0到0.5之间的double数数组。当生成第一个大于0.5的double数时,流将停止:
Supplier<Double> doubles = Math::random;
double[] arrOfDoubles = Stream.generate(doubles)
.takeWhile(t -> t < 0.5d)
.mapToDouble(i -> i)
.toArray();
那么如何使用新的JDK 17 API呢?RandomGenerator包含了众所周知的ints()、doubles()等方法,这些方法在其所有子接口中都是可用的。例如,StreamableGenerator可以这样使用:
StreamableGenerator streamableRnd
= StreamableGenerator.of("L128X1024MixRandom");
int[] arrOfStRndInts = streamableRnd.ints(10).toArray();
// 或者,简写为
StreamableGenerator.of("L128X1024MixRandom").ints(10).toArray();
以同样的方式,我们可以使用JumpableGenerator、LeapableGenerator等。好的,现在让我们回到我们的问题上。如何生成伪随机数生成器的流?RandomGenerator的所有子接口都包含一个名为rngs()的方法,它有多种形式。不带参数时,此方法返回一个实现RandomGenerator接口的新伪随机数生成器的无限流。以下代码生成了5个StreamableGenerator实例,每个实例生成了10个伪随机整数:
StreamableGenerator streamableRnd
= StreamableGenerator.of("L128X1024MixRandom");
List<int[]> listOfArrOfIntsSG
= streamableRnd.rngs(5) // 获取5个伪随机数生成器
.map(r -> r.ints(10)) // 每个生成器生成10个整数
.map(r -> r.toArray())
.collect(Collectors.toList());
我们可以使用JumpableGenerator完成同样的事情,但可能更喜欢使用jumps(),它实现了这种类型生成器的特定行为:
JumpableGenerator jumpableRnd
= JumpableGenerator.of("Xoshiro256PlusPlus");
List<int[]> listOfArrOfIntsJG = jumpableRnd.jumps(5)
.map(r -> {
JumpableGenerator jg = (JumpableGenerator) r;
int[] ints = new int[10];
for (int i = 0; i < 10; i++) {
ints[i] = jg.nextInt();
jg.jump();
}
return ints;
})
.collect(Collectors.toList());
同样的事情可以通过LeapableGenerator实现。这次,我们可以使用rngs(),或者使用leaps(),它实现了这种类型生成器的特定行为:
LeapableGenerator leapableRnd
= LeapableGenerator.of("Xoshiro256PlusPlus");
List<int[]> listOfArrOfIntsLG = leapableRnd.leaps(5)
.map(r -> {
LeapableGenerator lg = (LeapableGenerator) r;
int[] ints = new int[10];
for (int i = 0; i < 10; i++) {
ints[i] = lg.nextInt();
lg.leap();
}
return ints;
})
.collect(Collectors.toList());
接下来,让我们看看如何交错使用传统和新的伪随机数生成器。
猜你喜欢
- 2024-09-08 JavaWeb项目各种随机数主键ID的代码范例供大家参考学习
- 2024-09-08 Java中List集合有哪些特性?Java开发常见集合
- 2024-09-08 这么一篇.Java性能权威指南.不需要好好的了解一下吗?
- 2024-09-08 一篇文章彻底弄懂CAS实现SSO单点登录原理
- 2024-09-08 Java练习:输出并统计水仙花数、猜数字小游戏
- 2024-09-08 Javaweb代码创建JESESSION32位随机数及session最大不活动时间
- 2024-09-08 Java 中生成一组不重复随机整数的简便方法
- 2024-09-08 JDK 17 - Java 17 的新特性速览(java的什么特性实现了软件开发人员一次编写)
- 2024-09-08 Java教学:Integer、日期类、数字类、随机数、枚举,一次搞定!
- 2024-09-08 Java程序员面试宝典:用这100个问答搞定面试官
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)