Java手写生成随机数
package com.gton.test;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Set;
/**
* @description: 随机验证码
* @author: GuoTong
* @createTime: 2022-01-19 22:14
* @since JDK 1.8 OR 11
**/
public class YZM {
//随机数工具类
private SecureRandom secureRandom = new SecureRandom();
//定义生成的字符属性规定{0,1,2=====0:大写字母,1:小写字母,2:数字}
private char[] charIS = {0, 1, 2};
//创建接收随机数的容器
private StringBuilder builder = new StringBuilder();
public static void main(String[] args) {
System.out.println(new YZM().getCreateCode(5));
System.out.println(new YZM().getCreateCodeL2(5));
}
/**
* Description: 生成验证码,传入参数是验证码位数
*
* @author: GuoTong
* @date: 2022-01-19 22:17:24
*/
public String getCreateCode(int backSize) {
return randomNumberFactory(false, backSize, null);
}
/**
* Description: 生成验证码,传入参数是验证码位数
* 必须保持既有字母又有数字,不能纯字母或者纯数字
*
* @author: GuoTong
* @date: 2022-01-19 22:17:24
*/
public String getCreateCodeL2(int backSize) {
Set<Integer> container = new HashSet<>();
String randomNumber = randomNumberFactory(true, backSize, container);
if (container.size() == 3) {
return randomNumber;
} else {
System.out.println("原始生成的数-" + randomNumber);
randomNumber = handlerDifferentCombinations(backSize);
}
return randomNumber;
}
//判断是产生普通随机数还是类型多样保证随机数
private String randomNumberFactory(boolean isNeedMoreType, int backSize, Set<Integer> contenitore) {
for (int i = 0; i < backSize; i++) {
//需要随机判断本次字符生成什么类型
int charType = secureRandom.nextInt(charIS.length);
//判断这个想要生成字符类型是什么
switch (charType) {
case 0:
createUppercaseLetter();
if (isNeedMoreType) {
contenitore.add(1);//标识已经取到一类型数据
}
break;
case 1:
createLowerCaseLetters();
if (isNeedMoreType) {
contenitore.add(2);//标识已经取到一类型数据
}
break;
case 2:
createNumber();
if (isNeedMoreType) {
contenitore.add(3);//标识已经取到一类型数据
}
break;
}
}
return builder.toString();
}
//是否是不同的组合
private String handlerDifferentCombinations(int backSize) {
//重置不同的组合
builder = new StringBuilder();
//安排随机不同类型的数生成在什么位置,在不保证数的前面还是后面
int isBefore = secureRandom.nextInt(2);
switch (isBefore) {
case 0:
createL2NeedTypeNumber();
//上面随机保证三种类型在前三位数参数,后几位就随机生成
randomNumberFactory(false, backSize - 3, null);
break;
case 1:
randomNumberFactory(false, backSize - 3, null);
createL2NeedTypeNumber();
break;
}
return builder.toString();
}
//大写字母ASCII:A-Z:65 - 91
private void createUppercaseLetter() {
char ch = (char) (secureRandom.nextInt(26) + 65);
builder.append(ch);
}
//小写字母ASCII:a-z:97-97+25
private void createLowerCaseLetters() {
char ch2 = (char) (secureRandom.nextInt(26) + 97);
builder.append(ch2);
}
//数字0-9
private void createNumber() {
builder.append(secureRandom.nextInt(10));
}
//生成不同类型的数字各一个
private void createL2NeedTypeNumber() {
//生成随机数
int charType = secureRandom.nextInt(charIS.length);
switch (charType) {
case 0:
createUppercaseLetter();
createLowerCaseLetters();
createNumber();
break;
case 1:
createLowerCaseLetters();
createUppercaseLetter();
createNumber();
break;
case 2:
createNumber();
createLowerCaseLetters();
createUppercaseLetter();
break;
default:
break;
}
}
}
作者:隔壁老郭
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南