Java 8中java.util.Random类的简洁功能之一是对其进行了改进,现在可以返回随机的数字流 。
例如,要生成一个介于0(含)和1(不含)之间的随机双精度数的无限流:
Random random = new Random();
DoubleStream doubleStream = random.doubles();
或生成介于0(含)和100(不含)之间的无限整数流:
Random random = new Random();
IntStream intStream = random.ints(0, 100);
因此,我将演示一些场景,但请记住该无限随机流有什么用处,尽管由于这是无限流,所以一旦以某种方式限制了该流,则必须执行任何终端操作,否则操作不会终止!
例如。 获得10个随机整数的流并打印它们:
intStream.limit(10).forEach(System.out::println);
或生成100个随机整数的列表:
List<Integer> randomBetween0And99 = intStream.limit(100).boxed().collect(Collectors.toList());
对于高斯伪随机值,没有与random.doubles()等效的流,但是很容易拿出Java 8提供的功能:
Random random = new Random();
DoubleStream gaussianStream = Stream.generate(random::nextGaussian).mapToDouble(e -> e);
在这里,我使用Stream.generate api调用传递给Supplier,该Supplier用Random类中已经可用的方法生成下一个高斯。
因此,现在要对伪随机双精度流和高斯伪随机双精度流进行一些更有趣的操作,我想做的是获取这两个流中每个流的双精度分布,期望是绘制时的分布对于伪随机双精度子应均匀分布,对于高斯伪随机双精度子应呈正态分布。
在下面的代码中,我将为一百万个伪随机值生成这样的分布,它使用了新的Java 8 Streams API提供的许多功能:
Random random = new Random();
DoubleStream doubleStream = random.doubles(-1.0, 1.0);
LinkedHashMap<Range, Integer> rangeCountMap = doubleStream.limit(1000000).boxed().map(Ranges::of).collect(Ranges::emptyRangeCountMap, (m, e) -> m.put(e, m.get(e) + 1), Ranges::mergeRangeCountMaps);rangeCountMap.forEach((k, v) -> System.out.println(k.from() + "\t" + v));
这段代码沿这些行吐出数据:
-1 49730
-0.9 49931
-0.8 50057
-0.7 50060
-0.6 49963
-0.5 50159
-0.4 49921
-0.3 49962
-0.2 50231
-0.1 49658
0 50177
0.1 49861
0.2 49947
0.3 50157
0.4 50414
0.5 50006
0.6 50038
0.7 49962
0.8 50071
0.9 49695
并类似地生成一百万个高斯伪随机值的分布:
Random random = new Random();
DoubleStream gaussianStream = Stream.generate(random::nextGaussian).mapToDouble(e -> e);
LinkedHashMap<Range, Integer> gaussianRangeCountMap =gaussianStream.filter(e -> (e >= -1.0 && e < 1.0)).limit(1000000).boxed().map(Ranges::of).collect(Ranges::emptyRangeCountMap, (m, e) -> m.put(e, m.get(e) + 1), Ranges::mergeRangeCountMaps);gaussianRangeCountMap.forEach((k, v) -> System.out.println(k.from() + "\t" + v));
绘制数据可获得预期结果:
对于伪随机数据:
对于高斯数据:
- 完整的代码可在此处查看 -https://gist.github.com/bijukunjummen/8129250
翻译自: https://www.javacodegeeks.com/2014/01/java-util-random-in-java-8.html