JavaSE API实现生成随机数的2种方法(Random类和Math类的Random方法)

 更新时间:2023年10月16日 09:05:54   作者:_esther_  
本文主要介绍了JavaSE API实现生成随机数的2种方法,主要包括Random类和Math类的random方法都可以用来生成随机数,具有一定的参考价值,感兴趣的可以了解一下

生成随机数的两种方法

Random类和Math类的random方法都可以用来生成随机数
而Math类的random方法则是基于系统时间的伪随机数生成器,大于等于0.0小于1.0的随机double值范围[0,1)。例如: double num1 = Math.random() * 5 + 4;//范围[4,9)
Random类是基于种子的伪随机数生成器,有含参数和不含参数两种构造方式,不含参数的构造方法每次都使用当前系统时间作为种子,而含餐构造是使用一个固定值(参数n)作为种子范围[0,n)。例如:Random rd1 = new Random(); double num2 = rd1.nextDouble(); Random rd2 = new Random(10); double num3 = rd2.nextDouble();

Math.random() 无参调用,返回值为 double,大于等于 0.0 ,小于 1.0。范围[0.0,1.0)

static double random?() 返回值为 double的正值,大于等于 0.0 ,小于 1.0 。

double randomDouble = Math.random(); // 生成[0,1)之间的随机小数
int randomNumber = (int) (2 + Math.random() * 101); // 生成[2,103)之间的随机整数

Random类对象的next()方法,可有参。从这个随机数生成器的序列返回下一个伪随机数,均匀分布的 int值。

protected int next?(int bits) 生成下一个伪随机数。  
boolean nextBoolean?() 从该随机数生成器的序列返回下一个伪随机数,均匀分布的 boolean值。  
void nextBytes?(byte[] bytes) 生成随机字节并将它们放入用户提供的字节数组中。  
double nextDouble?() 返回下一个伪,均匀分布 double之间价值 0.0和 1.0从这个随机数生成器的序列。  
float nextFloat?() 返回下一个伪,均匀分布 float之间价值 0.0和 1.0从这个随机数生成器的序列。  
double nextGaussian?() 从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布的 double值,平均值为 0.0 ,标准偏差为 1.0 。  
int nextInt?() 从这个随机数生成器的序列返回下一个伪随机数,均匀分布的 int值。  
int nextInt?(int bound) 返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。  
long nextLong?() 返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 long值。 

 public static void main(String[] args) {
        //测试一下生成随机数的两种方法
        int i = 0;
        for (i = 0; i < 10000; i++) {
            System.out.println("=====================================");
            double numDouble1 = Math.random();
            int numInt1 = (int)(Math.random()*(10));
            System.out.println("Math.random的随机浮点数[0.0,1.0):" + numDouble1);
            System.out.println("Math.random的随机整数[0,9]" + numInt1);
            System.out.println("---------------------------------------");

            Random rd = new Random();
            double numDouble2 = rd.nextDouble();
            int numInt2 = rd.nextInt();
            int numInt3 = rd.nextInt();

            int numInt4 = rd.nextInt(4);
            int numInt5 = rd.nextInt(4);
            System.out.println("Random对象的无参随机浮点数[0.0,1.0]:" + numDouble2);//不知道边界情况,没人说过,只说之间。不管了,反正都用Math类
            System.out.println("Random对象的无参随机整数[-整数,整数]:"  + numInt2 + "," + numInt3);
            System.out.println("Random对象的参数构造[0,4):" + numInt5 + "," + numInt4);

        }
        System.out.println("执行" + i + "次");
    }
}

Random有参构造后,调用方法生成随机数,数完全相同

只要Random构造的参数固定,生成的随机数也固定,完全不随机。不推荐使用

         System.out.println("--------------------------------------");
            Random rd1 = new Random(10);
            double numDouble3 = rd1.nextDouble();
            Random rd2 = new Random(10);
            double numDouble4 = rd2.nextDouble();
            System.out.println("参数10的Random对象生成的随机浮点数" + numDouble3 + "," + numDouble4);//因为种子相同,所以生成的数也相同
            System.out.println("参数10的Random对象生成的随机整数[0,5):" + numInt6 );

其中三次运行结果

=====================================
Math.random的随机浮点数[0.0,1.0):0.7142916697602802
Math.random的随机整数[0,9]:6
---------------------------------------
Random对象的无参随机浮点数[0.0,1.0]:0.6315568322991557
Random对象的无参随机整数[-整数,整数]:73848388,929911462
Random对象的参数构造[0,4):0,0
--------------------------------------
参数10的Random对象生成的随机浮点数:0.7304302967434272,0.7304302967434272
参数10的Random对象生成的随机整数[0,5):3
=====================================
Math.random的随机浮点数[0.0,1.0):0.6622105346737387
Math.random的随机整数[0,9]:4
---------------------------------------
Random对象的无参随机浮点数[0.0,1.0]:0.7790519044760864
Random对象的无参随机整数[-整数,整数]:-1185189383,-718067040
Random对象的参数构造[0,4):2,2
--------------------------------------
参数10的Random对象生成的随机浮点数:0.7304302967434272,0.7304302967434272
参数10的Random对象生成的随机整数[0,5):3
=====================================
Math.random的随机浮点数[0.0,1.0):0.4240920821616745
Math.random的随机整数[0,9]:8
---------------------------------------
Random对象的无参随机浮点数[0.0,1.0]:0.36926846454559725
Random对象的无参随机整数[-整数,整数]:1829129943,120476504
Random对象的参数构造[0,4):2,0
--------------------------------------
参数10的Random对象生成的随机浮点数:0.7304302967434272,0.7304302967434272
参数10的Random对象生成的随机整数[0,5):3

总结:
1.Math.random方法明确范围[0,1)
2.Random类无参构造时,无参调用方法生成随机数都为该类型数的范围,但如double为0.0~1.0之间但不清楚边界包含情况,慎用
3.Random类有参构造时,若参数固定,不管有参还是无参调用方法得到的数都相同如

			Random rd2 = new Random(10);
            double numDouble4 = rd2.nextDouble();//循环多少次都固定产生0.7304302967434272
            int numInt6 = rd2.nextInt(5);//固定产生3

到此这篇关于JavaSE API实现生成随机数的2种方法(Random类和Math类的Random方法)的文章就介绍到这了,更多相关JavaSE 生成随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • javaweb如何实现请求和响应

    javaweb如何实现请求和响应

    这篇文章主要为大家详细介绍了javaweb如何实现请求和响应,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Spring Boot项目启动报错Unable to start web server解决方法

    Spring Boot项目启动报错Unable to start web server解决方法

    这篇文章主要给大家介绍了关于Spring Boot项目启动报错Unable to start web server的解决方法,错误内容大概的意思是未能加载嵌入的供web应用加载的空间,是因为缺少ServletWebServerFactorybean,需要的朋友可以参考下
    2024-07-07
  • Spring模块详解之Spring ORM和Spring Transaction详解

    Spring模块详解之Spring ORM和Spring Transaction详解

    Spring ORM 是 Spring 框架的模块之一,旨在简化与 JPA、Hibernate、JDO 等 ORM 工具的集成,通过提供统一的 API 和模板类,如 HibernateTemplate 和 JpaTemplate,Spring ORM 使开发者可以更便捷地执行数据库操作,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • servlet上传文件实现代码详解(四)

    servlet上传文件实现代码详解(四)

    这篇文章主要为大家详细介绍了servlet上传文件的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 使用Jenv管理多版本JDK环境的详细教程

    使用Jenv管理多版本JDK环境的详细教程

    在现代 Java 开发中,我们经常需要在不同的项目中使用不同版本的 JDK,手动切换 JAVA_HOME 环境变量既繁琐又容易出错,Jenv 是一个优秀的 JDK 版本管理工具,可以让我们轻松地在不同 JDK 版本间切换,所以本文给大家介绍了使用Jenv管理多版本JDK环境的详细教程
    2025-08-08
  • 浅析Java单例设计模式(自写demo)

    浅析Java单例设计模式(自写demo)

    Java单例模式是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显,下面这篇文章主要给大家详细介绍了Java中单例模式,需要的朋友可以参考下
    2021-12-12
  • Springboot WebFlux集成Spring Security实现JWT认证的示例

    Springboot WebFlux集成Spring Security实现JWT认证的示例

    这篇文章主要介绍了Springboot WebFlux集成Spring Security实现JWT认证的示例,帮助大家更好的理解和学习使用springboot框架,感兴趣的朋友可以了解下
    2021-04-04
  • springMVC图片上传的处理方式详解

    springMVC图片上传的处理方式详解

    这篇文章主要为大家详细介绍了springMVC图片上传的处理方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java基础知识之I/O流和File类文件操作

    Java基础知识之I/O流和File类文件操作

    众所周知java语言提供给程序员非常多的包供编程时使用,方便又快捷,下面这篇文章主要给大家介绍了关于Java基础知识之I/O流和File类文件操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Mybatis Example的高级用法详解

    Mybatis Example的高级用法详解

    这篇文章主要介绍了Mybatis Example的高级用法详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论