随机数
随机数:随机生成的任意一个数(理论上讲具有不可预知性)
1. Random类
Random类用于生成一个伪随机数(相同的种子,产生相同是随机数)。
1.1 无参构造器
public class RandomDemo {
public static void main(String[] args) {
Random r1 = new Random();
System.out.println(r1.nextBoolean()); // 布尔类型随机数
System.out.println(r1.nextDouble()); // double类型随机数
System.out.println(r1.nextInt()); // int类型随机数
System.out.println("华丽的分割线...........");
Random r2 = new Random(16);
System.out.println(r2.nextBoolean()); // 布尔类型随机数
System.out.println(r2.nextDouble()); // double类型随机数
System.out.println(r2.nextInt()); // int类型随机数
}
}
false
0.9883111788245811
-1551960633
华丽的分割线...........
true
0.5269255120728326
-906959996
Process finished with exit code 0
1.2 含参构造器
使用指定了随机数种子的含参数构造器初始化对象,无论打印多少次,同类型的数据都是相同的数据
public class RandomDemo {
public static void main(String[] args) {
Random r1 = new Random(16);
System.out.println(r1.nextBoolean()); // 布尔类型随机数
System.out.println(r1.nextDouble()); // double类型随机数
System.out.println(r1.nextInt()); // int类型随机数
System.out.println("华丽的分割线...........");
Random r2 = new Random(16);
System.out.println(r2.nextBoolean()); // 布尔类型随机数
System.out.println(r2.nextDouble()); // double类型随机数
System.out.println(r2.nextInt()); // int类型随机数
}
}
true
0.5269255120728326
-906959996
华丽的分割线...........
true
0.5269255120728326
-906959996
Process finished with exit code 0
1.3 使用Random对象生成指定范围内的随机数
如:生成66,88之间的随机数
Random r1 = new Random();
System.out.println(r1.nextInt(66) + 22); // [66,88)之间
2. ThreadLocalRandom类
ThreadLocalRandom是java7新特性,是Random类的子类,在多线程并发的情况下,相对于Random可以减少多线程资源竞争,保证了线程的安全性。
我们来看下ThreadLocalRandom(JDK1.8)的构造器:
可以发现,ThreadLocalRandom构造器被私有化起来了,我们是无法创建ThreadLocalRandom对象的!!
但是,我们又发现ThreadLocalRandom类中的许多方法都没有使用static修饰(使用static修饰的图标,方法前都会有灰色的菱形图标,idea中具体的图标请查看此博客),说明需要使用对象来调用,但是我们又无法创建ThreadLocalRandom对象。这种情况下,在该类中绝对会有静态方法(static修饰)用来返回当前对象。
用于返回当前对象的静态方法:
ThreadLocalRandom r = ThreadLocalRandom.current();
// 接下就可以继续调用父类中的方法了,如:
System.out.println(random.nextInt()); //生成随机数
2.1 使用ThreadLocalRandom对象生成指定范围内的随机数
在之前使用Rnadom类生成66,88之间的随机数:
new Random().nextInt(66) + 22; // [66,88)之间
现在我们可以直接使用:
ThreadLocalRandom.current().nextInt(66,88); // [66,88)之间
3. UUID类
Universally Unique Identifier(UUID): 在一台机器上生成的数字,它保证在同一时空中所有机器都是唯一的。从JDK1.5开始出现。
UUID是一个128位长的数字,一般用16进制表示,算法的核心思想是结合机器的网卡Mac地址、当地时间、一个随机生成数来生产UUID 。(据说2000年不会重复一次)
唯一缺陷:长度太长了!但也保证了唯一性
我们经常用来表示一个随机的唯一的字符串,(主要用于设置数据库的主键)
经常使用的一个方法:randomUUID()
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
打印出来的是一个16进制的随机数:
0c2f1b8f-e0fb-4d5d-84cf-510e0dda6250
4. 随机数生成案例(模拟验证码)
String upLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //大写字母
String lowLetters = upLetters.toLowerCase(); // 小写字母
String nums = "1234567890"; // 数字
StringBuilder letters = new StringBuilder(80);
StringBuilder random = new StringBuilder(5);
letters.append(upLetters).append(lowLetters).append(nums);
for (int i = 0; i < 5; i++) {
// 产生随机位置的索引
int randIndex = ThreadLocalRandom.current().nextInt(0, letters.length());
//将该位置索引添加到random 中
random.append(letters.charAt(randIndex));
}
System.out.println(random);
}