【Java】随机数(Random-ThreadLocalRandom-UUID),模拟验证码

随机数

随机数:随机生成的任意一个数(理论上讲具有不可预知性)

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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值