在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中Math.random()与java.util.random()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法,下面这篇文章主要给大家介绍了关于java.util.Random实现原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构
众所周知,随机数是任何一种编程语言最基本的特征之一。...Java实战项目里面介绍了一些不正确使用java.util.Random API的危害。这个教训告诉我们不要使用: 1.Math.abs(rnd.nextInt())%n 而使用: 1.rnd.nextInt(n)
绍java.util.Random与Math.random区别
运用下列类进行JAVA编程: Date Calendar Random 使用 Collection 接口及其实现类 ArrayList LinkedList 使用 HashMap 使用Vector 等方法的使用
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_...
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_...
在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.Math.Random()静态方法,另一种是创建java.util.Random对象。本文介绍了两种方法的使用过程。
使用JAVAScript实现模仿斗地主发牌程序,使用公司... Authorized use random function in Java. Java. Util. Random (), through the cycle than to remove duplicate Random value. Redundancy is too big, I'm sorry.
import java.util.Random; import java.util.Scanner; public class AnimeShowGame { // 声明全局变量 private static ArrayList<String> characters = new ArrayList(); private static ArrayList<String> ...
import java.util.Random; import java.util.Scanner; /** * 使用递归分割绘制迷宫 * * @author WangSong * * @Time 2020-6-22 */ abstract class Arithmetic { /** 路表示为1 */ public final int ROUND ...
介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供...
在Java中,生成随机数可以使用java.util.Random类或java.util.concurrent.ThreadLocalRandom类。这两个类提供了生成伪随机数的方法,下面是它们的详细介绍: 使用java.util.Random类生成随机数: 创建Random类的...
java控制台程序 1)控制台输入指令1,添加数据到数组 2)控制台输入指令2,随机生成一个输入数据 3)控制台输入指令3,退出程序 使用到的类 java.util.ArrayList ...java.util.Random java.util.Scanner
It also covers most of the classes in the main packages (java.lang, java.util, java.io) as implemented in the J2SE™ Development Kit 5.0 (more commonly known as JDK 5.0, or in the older nomenclature ...
/** * 案例 模拟双色球 * 系统生成一个蓝球和六个红球 并存储起来 * 接受用户选号 1个蓝球 ...import java.util.Random; //引入生成随机字符的工具类 import java.util.Scanner; //接收数据流的类 public class demo {
import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JPanel; public class MyJPanel extends JPanel implements Runnable,MouseMotionListener{ Yingxiongji yingxiong = new ...
Jafaran(Java快速随机)提供了Java.util.Random的快速(对于更多随机性)实现,以及其他nextXXX()方法以及用于检索和恢复状态的方法。 如果实现名称是线程安全和非阻塞的,则实现名称包含“ Conc”(用于并发),...