Java 8中的java.util.Random

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

参考: all和其他博客中的JCG合作伙伴 Biju Kunjummen提供的Java 8中的java.util.Random

翻译自: https://www.javacodegeeks.com/2014/01/java-util-random-in-java-8.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值