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 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来调用了一个高斯数的生产者,这个生产者用的是Random类里的一个现成的方法。

现在,有了伪随机的浮点数和高斯浮点数后,我们来做点有意思的事情吧。我想做的是获取这两个流生成的浮点数的一个分布情况,正常情况下,伪随机浮点数应该是呈连续均匀分布的,而高斯浮点数应该呈正态分布。

在下面的代码中,我将会生成一份上百万随机数的分布状况,这里用到了Java8的流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));
数据分布图不出所料: 随机数的:

高斯随机数的:

原创文章转载请注明出处:Java 8里面的java.util.Random

英文原文链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值