在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来调用了一个高斯数的生产者,这个生产者用的是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
分享到:
相关推荐
Java8中的java.util.Random类 文章代码,不多解释啦,不需要你安装其它的jar包。
Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构
在性能方面,`Math.random()` 通常被认为比 `Random.nextInt()` 快,因为它不需要创建对象。然而,对于大多数应用来说,这种差异可能微不足道,除非你在生成大量随机数时特别关注性能。 总的来说,如果你需要简单...
java.util.Random与Math.random的区别 java.util.Random和Math.random都是Java语言中用于生成随机数的方法,但是它们之间存在着一些重要的区别。 Math.random()方法 Math.random()方法是Java.lang.Math类中的一个...
标题“java.util.pdf”暗示这是一个关于Java编程语言中util包的文档。由于描述和标签均重复标题,我们可以推断文档重点在于解释和示例展示java.util包中的类与接口。java.util是Java的标准库中的一个包,主要用于...
Java.util包是Java标准库中的核心包之一,包含了许多用于处理集合、数组、日期时间、随机数等的类。在本文件中,我们主要关注Java.util.ArrayList类,这是一个常用的动态数组实现,它提供了灵活的大小调整和高效的...
在Java编程语言中,`java.util.Random` 类是生成伪随机数的核心工具。这个类提供了多种生成不同类型随机数的方法,包括整数(int、long)、浮点数(float、double)以及高斯分布(Gaussian)随机数。与 `java.lang....
import java.util.Random; public class Random02 { public static void main(String[] args) { Random ran = new Random(); int i = ran.nextInt(100 - 50 + 1) + 50; if (i % 3 == 0) { System.out.println...
Java.util包是Java标准库中的核心包之一,它包含了大量用于日常编程的工具类和接口。这个包在Java 2版本中得到了显著增强,引入了许多重要的数据结构和算法,为Java程序员提供了更丰富的功能。 首先,Java.util包中...
Java提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...
5. **`java.util.Date`** 和 **`java.time.*`** (Java 8+): 传统的日期/时间处理类,以及Java 8引入的更现代、更易用的时间API。 6. **`java.util.HashMap`** 和 **`java.util.Map`** 接口: 存储键值对的数据结构。...
运用下列类进行JAVA编程: Date Calendar Random 使用 Collection 接口及其实现类 ArrayList LinkedList 使用 HashMap 使用Vector 等方法的使用
java.util.Random r=new java.util.Random(); System.out.println(r.nextInt()); } } ``` 实例2:带种子 ```java public class Test5{ public static void main(String[] args) { java.util.Random r=new java....
boolean booleanNumber = random.nextBoolean(); // 获取true或false的随机布尔值 ``` `Random`类还允许我们自定义随机数的种子。通常情况下,它使用系统当前时间作为种子,确保每次运行时产生不同的随机数序列。但...
java.util.Random d1 = new java.util.Random(); java.util.UUID d2; int ji_i; long ji起始时间_i; long ji截至时间_i; java.util.Date date = new java.util.Date(); //生成1万个序列化後的文本 for (ji_...
5. **`java.util.Random`**:生成随机数,适用于各种随机算法或模拟场景。 6. **`java.io.*`** 包:包含大量工具类,用于输入/输出操作,如`FileReader`、`BufferedReader`、`PrintWriter`等。 7. **`java.util....
Java.util包是Java编程语言中的核心包之一,它包含了大量用于日常编程的类和接口,是Java程序员必备的知识点。本教程重点讲解了Java.util包中的主要组件和使用方法,旨在帮助初学者深入理解并熟练运用这个包。 1. *...