Java获取随机数的n种方法
作者:way_more
前言
在项目中,我们常常会用到随机数,那你知道几种随机数的生成方法呢,在这里,分享一下我知道的随机数生成方法
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获取随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!