网站首页 > 精选教程 正文
在创建伪随机数生成器的流之前,让我们先创建一个伪随机数的流。首先,让我们看看如何使用传统的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-11-16 Java编程从零开始07 数组的基本算法(查找和排序)
- 2024-11-16 Java练习:一个猜数游戏(java猜数游戏程序)
- 2024-11-16 Java中生成唯一ID的方法(java 生成id)
- 2024-11-16 617、java类,对象,集合的介绍(java中对象是什么)
- 2024-11-16 聊聊最近面试中遇到的算法题:公平的随机
- 2024-11-16 Java实现7种常见密码算法(java密码加密哪种方式最安全)
- 2024-11-16 JAVA入门:零基础实现幸运抽奖功能
- 2024-11-16 Hive 自定UDF函数,生成 32 位随机数
- 2024-11-16 四十三、Java常用类-Random类:深入理解与实践指南
- 2024-11-16 在程序中用的随机数,足够随机吗?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)