Java两种常用的随机数生成方式(小白总结)
作者:倏逝波 发布时间:2023-02-16 16:54:19
人机交互过程中,当我们需要机器给我们反馈不确定的数字结果时,就会需要用到随机数了,那么,在Java中,我们应当如何来生成并使用随机数呢?
一、通过Random类来实现
Random类是JDK的java.util包中的一个工具类,该类可用于在指定范围内产生随机数字。考察一下Random类的两种构造方法:无参构造和有参构造
Random(); 无参构造方法创建一个伪随机数生成器。Random(long seed);有参构造方法使用一个long型的种子创建伪随机数生成器。
下面分别使用两种方式创建Random对象来获取10个0到100的随机数
无参构造方式
public class demo1 {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt(100));
}
}
运行结果:
这里总结一个应用random.nextInt()的式子:random.nextInt(n)+m,返回的是m到m+n-1之间的随机数。比如random.nextInt(9)+1,得到就是1到10之间的某数,如果没有n和m,那么就是生成一个随机的int类型的值。当然除了int类型,也可以生成其他数字型的基本数据类型的随机数,比如double、float、byte等等。
nextDouble()方法返回的是0.0到1.0之间的一个double类型的值
nextFloat()方法返回的是0.0到1.0之间的一个float类型的值
有参构造方式
public class demo1 {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt(100));
}
Random random1 = new Random(100);
System.out.println("---------");
for(int i = 0 ;i<10;i++){
System.out.println(random1.nextInt(100));
}
}
这里为了方便跟无参构造方法创建的随机数生成器作比较,创建了两个Random对象。
运行结果:
再执行一次代码的结果:
怎么样?是不是发现下面的有参构造生成的随机数每次运行结果都是一样的,而无参构造方法的random对象每次都能得到不同的随机数。
这里的原因是:无参构造方法在创建Random对象时没有传入种子参数,程序会自动以当前时间为时间戳,于是每一次的运行结果都是不同的。而有参构造方法创建Random对象时传入了种子参数,两次运行时种子相同,实际上不管运行多少次,结果都是一样的。
二、使用Math类的random方法
Java中的Math类也提供了一个生成随机数的random方法。
首先需要明确,Math.random()是随机生成一个0.0到1.0之间的double类型的随机数,这里包含0而不包含1。
常见的用法:
public class demo1 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println((int) (Math.random() * 10));
}
}
Math.random()生成0到1之间的double数,乘以10就变成了0到10之间的double数,再转成int型,这是我平时接触比较多的用法(通常我们使用随机数也是int类型的居多)。运行结果如下(3个0到10之间的整数):
根据需要可以灵活使用random()方法:
(int)(Math.random()*n)生成大于等于0小于n的随机数。
(int)(Math.randon()*n)+m生成大于等于m小于m+n的之间的随机数。
(int)(Math.random()*(n-m)+m)生成从m到n范围内的数,包含m不包含n。
另外,我们还可以用这种方式生成字符:
随机生成a~z之间的字符
(char)(‘a'+Math.random()*(‘z'-‘a'+1));
随机生成cha1~cha2的字符
(char)(cha1+Math.random()*(cha2-cha1+1));
小结
来源:https://blog.csdn.net/weixin_43427312/article/details/109007595


猜你喜欢
- 简介Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生
- springboot启动失败的问题springboot版本是1.3.0.M1,连接的mysql版本为8,用spring-boot-start
- 悲观锁和乐观锁是面试高频问题之一,本文将对悲观锁和乐观锁简单的进行一个介绍。悲观锁(Pessimistic Locking)悲观锁在并发环境
- 按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Co
- 写在前面注:本文章使用的 SpringBoot 版本为 2.2.4.RELEASE,其 Spring 版本为 5.2.3.RELEASE前言
- 记得之前写Web项目的时候配置文件的读取都是用Properties这个类完成的,当时为了项目的代码的统一也就没做什么改动。但事后一直在琢磨S
- 这篇文章主要介绍了Java流程控制顺序结构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- Android 拦截返回键事件的实例详解KeyEvent类Android.View.KeyEvent类中定义了一系列的常量和方法,用来描述A
- EasyTouch摇杆插件使用,先给大家展示下效果图:Demo展示双指缩放在电脑端无法掩饰,竖屏将就看看吧;插件名叫EasyTouch,有需
- 一、List<T>对象中的T是值类型的情况(int 类型等)对于值类型的List直接用以下方法就可以复制:List<T&g
- 包含不重复元素的集合称为“集(set)”。.NET Framework包含两个集HashSet<
- 方法一class Program { [STAThread] static
- 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:
- 本文实例讲述了Android基于Intent实现Activity之间数据传递的方法。分享给大家供大家参考,具体如下:MainActivity
- 1、使用步骤1)构建请求网址A、确定端点:每个GIS服务都有一个端点。例如,ArcGIS Server上Demographics文件夹下名为
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看flyme6的Viewpager指示器,觉得有点意思,就模仿写了一下,整体效
- 小总结抛出异常:创建异常对象,封装异常信息然后通过throw将异常对象传递给调用者。不对异常进行处理只对异常进行抛出是非常不负责任的表现可以
- 1. 三种常用的字符串判空串方法:Length法:bool isEmpty = (str.Length == 0);Empty法:bool
- Android系统里面有四种类型的菜单:options menu(选项菜单),context menu(上下文菜单),sub m