Java获取随机数的n种方法
前言
在项目中,我们常常会用到随机数,那你知道几种随机数的生成方法呢,在这里,分享一下我知道的随机数生成方法
1、使用Math.random()方法
Math.random() 产生的随机数是0-1之间的一个double数值,有15位小数,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机
Math.random()获取到的随机数如下
0.6195107792727859
如下,为获取1到10的int类型随机数,+1表示最小值为1,因为random方法的最小值是0
(int)(1+Math.random()*10)
生成0到9的随机数,如下
(int)(Math.random()*10)
想要获得比m小1的int或者long类型数值,只需要使用以下公式
(类型)(Math.random()*m)
想要获得指定范围[最小值,最大值]的随机数,使用以下公式
(数据类型)(最小值+Math.random()*(最大值-最小值+1))
例:获取10到99的随机数
(int)(Math.random()*90+10)
注意:Math.random() 产生的随机数是大于等于0,小于1(不等于1)的double数值
2、Random类
通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
使用方法如下:
(01) 创建Random对象。有两种方法可以创建Random对象,如下:
Random random = new Random();//默认构造方法 Random random = new Random(1000);//指定种子数字
(02) 通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。
比如,获取[0, 100)之间的int整数。方法如下: int i2 = random.nextInt(100);
构造方法:
// 构造函数(一): 创建一个新的随机数生成器。
Random()
// 构造函数(二): 使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
Random(long seed)
常用方法:
boolean nextBoolean() // 返回下一个“boolean类型”伪随机数。 void nextBytes(byte[] buf) // 生成随机字节并将其置于字节数组buf中。 double nextDouble() // 返回一个“[0.0, 1.0) 之间的double类型”的随机数。 float nextFloat() // 返回一个“[0.0, 1.0) 之间的float类型”的随机数。 int nextInt() // 返回下一个“int类型”随机数。 int nextInt(int n) // 返回一个“[0, n) 之间的int类型”的随机数。 long nextLong() // 返回下一个“long类型”随机数。
提示:所以若非必要,不要设置随机数种子。
因为在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数。
种子相同,即使实例不同也产生相同的随机数。
如下:
Random random1=new Random(1000);
Random random2=new Random(1000);
for (int i=0;i<10;i++){
System.out.print(random1.nextInt(100));
}
System.out.println();
for (int i=0;i<10;i++){
System.out.print(random2.nextInt(100));
}
输出
87357624924941456450
87357624924941456450
可以看到,两个不同的实例,但输出的随机数是一模一样的,这就是因为种子相同,所以我们一般不要指定一个种子。
Random()无参构造方法使用的是一个时间值,所以每一次的seed值都不一样
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}3、ThreadLocalRandom
ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。
我们联想一下ThreadLocal。ThreadLocal通过让每一个线程复制一份变量,使得在每个线程对变量进行操作时实际是操作自己本地内存里面的副本,从而避免了对共享变量进行同步。
实际上ThreadLocalRandom的实现也是这个原理,Random的缺点是多个线程会使用同一个原子性种子变量,从而导致对原子变量更新的竞争。
ThreadLocalRandom类的用法与Random类的用法基本相似,它提供了一个静态的current()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextInt()方法来获取伪随机数了。
ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式来生成各种伪随机数。可以生成浮点类型的伪随机数,也可以生成整型类型的伪随机数,还可以指定生成随机数的范围。
ThreadLocalRandom rand = ThreadLocalRandom.current(); //生成一个4~20的伪随机整数 int val1 = rand.nextInt(4 , 20); //生成一个2.0~10.0之间的伪随机浮点数 double val2 = rand.nextDouble(2.0 , 10.0);
4、UUID
UUID是jdk1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID
UUID生成的形式如下,会有-,所以我们一般会把-去掉
aec0ae4d-59f9-4070-8c5b-13c00a4611b6
使用:
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-", "");
5、 获取字母和数字的随机数
如果我们想获取一个字母和数字的随机数,我们可以使用以下方法
public static final String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
public static String getRandomString(int length){
Random random=new Random();
StringBuffer sb=new StringBuffer();
for(int i=0;i<length;i++){
int number=random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}到此这篇关于Java获取随机数的n种方法的文章就介绍到这了,更多相关Java获取随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解Spring框架之基于Restful风格实现的SpringMVC
这篇文章主要介绍了详解Spring框架之基于Restful风格实现的SpringMVC,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05
Spring MVC结合Spring Data JPA实现按条件查询和分页
这篇文章主要为大家详细介绍了Spring MVC结合Spring Data JPA实现按条件查询,以及分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-10-10
Spring Cloud Stream如何实现服务之间的通讯
这篇文章主要介绍了Spring Cloud Stream如何实现服务之间的通讯,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-10-10
mybatis3.4.0不支持LocalDateTime的解决方法(No typehandler f
本文主要介绍了mybatis3.4.0不支持LocalDateTime的解决方法(No typehandler found for property time),具有一定的参考价值,感兴趣的可以了解一下2025-03-03
Springboot2.x 使用 Log4j2 异步打印日志的实现
这篇文章主要介绍了Springboot2.x 使用 Log4j2 异步打印日志的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-12-12
Java HashTable与Collections.synchronizedMap源码深入解析
HashTable是jdk 1.0中引入的产物,基本上现在很少使用了,但是会在面试中经常被问到。本文就来带大家一起深入了解一下Hashtable,需要的可以参考一下2022-11-11
一文深入分析java.lang.ClassNotFoundException异常
这篇文章主要给大家介绍了关于java.lang.ClassNotFoundException异常的相关资料,java.lang.ClassNotFoundException是Java编程时经常会遇到的一个异常,它表示JVM在尝试加载某个类时未能找到该类,需要的朋友可以参考下2023-10-10


最新评论