`
deepinmind
  • 浏览: 444904 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:40835
社区版块
存档分类
最新评论

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来调用了一个高斯数的生产者,这个生产者用的是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类文章代码

    Java8中的java.util.Random类 文章代码,不多解释啦,不需要你安装其它的jar包。

    浅谈java中Math.random()与java.util.random()的区别

    下面小编就为大家带来一篇浅谈java中Math.random()与java.util.random()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    关于java.util.Random的实现原理详解

    Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法,下面这篇文章主要给大家介绍了关于java.util.Random实现原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

    java.util包

    Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构

    java随机数

    众所周知,随机数是任何一种编程语言最基本的特征之一。...Java实战项目里面介绍了一些不正确使用java.util.Random API的危害。这个教训告诉我们不要使用: 1.Math.abs(rnd.nextInt())%n 而使用: 1.rnd.nextInt(n)

    java.util.Random与Math.random区别

    绍java.util.Random与Math.random区别

    java.util 包 是Java中很大的一个集合

    运用下列类进行JAVA编程: Date Calendar Random 使用 Collection 接口及其实现类 ArrayList LinkedList 使用 HashMap 使用Vector 等方法的使用

    JSON序列化与反序列化JAVA工具

    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_...

    JSON序列化及反序列化工具

    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产生随机数的两种方式

    在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.

    Java设计二次元动漫人物演出活动小游戏代码.docx

    import java.util.Random; import java.util.Scanner; public class AnimeShowGame { // 声明全局变量 private static ArrayList&lt;String&gt; characters = new ArrayList(); private static ArrayList&lt;String&gt; ...

    Java课程设计-老鼠走迷宫

    import java.util.Random; import java.util.Scanner; /** * 使用递归分割绘制迷宫 * * @author WangSong * * @Time 2020-6-22 */ abstract class Arithmetic { /** 路表示为1 */ public final int ROUND ...

    实用工具类库java.util

    介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供...

    java 随机数.docx

    在Java中,生成随机数可以使用java.util.Random类或java.util.concurrent.ThreadLocalRandom类。这两个类提供了生成伪随机数的方法,下面是它们的详细介绍: 使用java.util.Random类生成随机数: 创建Random类的...

    java控制台输入随机数据,比如各种水果,食物,然后随机出现一种输入的商品

    java控制台程序 1)控制台输入指令1,添加数据到数组 2)控制台输入指令2,随机生成一个输入数据 3)控制台输入指令3,退出程序 使用到的类 java.util.ArrayList ...java.util.Random java.util.Scanner

    Addison.Wesley.The.Java.Programming.Language.4th.Edition.Aug.2005.chm

    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 ...

    java模拟双色球彩票程序.txt

    /** * 案例 模拟双色球 * 系统生成一个蓝球和六个红球 并存储起来 * 接受用户选号 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.util.Random的快速,随机的实现。-开源

    Jafaran(Java快速随机)提供了Java.util.Random的快速(对于更多随机性)实现,以及其他nextXXX()方法以及用于检索和恢复状态的方法。 如果实现名称是线程安全和非阻塞的,则实现名称包含“ Conc”(用于并发),...

Global site tag (gtag.js) - Google Analytics