浏览 5600 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-03-11
最后修改:2014-03-11
比如,如果要生成[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来调用了一个高斯数的生产者,这个生产者用的是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)); 数据分布图不出所料: 随机数的: 高斯随机数的: 更多文章请关注: deepinmind 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-03-16
jdk 8 发布了?
|
|
返回顶楼 | |
发表时间:2014-03-16
过两天就正式发布了,现在也可以下载了
|
|
返回顶楼 | |