@TOC
个人写作项目:使用String实现随机产生验证码,每位可以是数字、大小写字母。(随机生成1-62位验证码)
【提示】
1.设计方法接收一整型参数createCode( int m ),最终返回对应位数的随机验证码
2.方法内定义2个字符串变量,1用来存生成的验证码,1用来存要用到的全体字符
3.循环控制生成多少位随机字符
4.随机产生字符范围内的索引
5.根据索引提取字符,把该字符交code变量连接
6.循环结束后返回code即可
7.在主方法中调用createCode( int m )
注:并未严格按照提示进行编写
测试类:
public static void main(String[] args) {
/*使用String实现随机产生验证码,每位可以是数字、大小写字母。 * */
Scanner input = new Scanner(System.in);
System.out.print("请输入1-62的验证码位数:");
int num = input.nextInt();
VerificationCode ver = new VerificationCode();
ver.setNum(num);
System.out.print(ver.verCode());
}
参与类:
/**
* @program: Day01
* @ClassName VerificationCode
* @description(类信息): 验证码类
* @author: honor
* @create: 2024-04-25 22:51
* @Version 1.0
**/
public class VerificationCode {
private String ver = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private String vc;
private int Num;
public VerificationCode() {
this.Num = random();
}
public void setNum(int num) {
this.Num = num;
}
/**
* @return int
* @ClassName VerificationCode
* @anthor 上善若水
* @description (方法信息):生成一个1-62的随机数
* @Date 2024/4/25 23:17
* @Param []
*/
public int random() {
return (int) (Math.random() * 62 + 1);
}
/**
* @return int
* @ClassName VerificationCode
* @anthor 上善若水
* @description (方法信息):循环生成不重复的限定随机数数组
* @Date 2024/4/25 23:25
* @Param []
*/
public int[] vec() {
int[] num = new int[this.Num];
int count = 0;
while (true) {
int ran = random();
if (!contains(num, ran)) {
num[count] = ran;
count++;
if (count >= num.length)
break;
}
}
return num;
}
/**
* @return java.lang.String
* @ClassName VerificationCode
* @anthor 上善若水
* @description (方法信息):生成随机数的验证码
* @Date 2024/4/26 0:16
* @Param []
*/
public String verCode() {
StringBuilder str = new StringBuilder(this.Num);
for (int vers : vec()) {
str.append(this.ver.charAt(vers - 1));
}
return str.toString();
}
/**
* @return boolean
* @ClassName VerificationCode
* @anthor 上善若水
* @description (方法信息):检查数组中是否含有该元素
* @Date 2024/4/26 0:16
* @Param [num, ran]
*/
public boolean contains(int[] num, int ran) {
return Arrays.stream(num).anyMatch(i -> i == ran);
}
}
思路:
用Random生成随机数,按照预备字符串数量生成随机不重复的数组,利用增强循环与chatAt方法循环提出字符串字符放入可变字符串中,再将可变字符串转换成字符串输出
问题:
在Random方法判断中出现问题(在0-61生成中,极限62位 边界输出 0标志(a)总是最后生成,可能是空数组中NULL元素被判断成0导致,转换成1-62解决问题)
总结:
思路大体完善,达成预期目标,方法独立性强,通用性强。但是该方法并没有进行封装和安全保护防继承,边界输出防范也没写,还有特殊字符也未写入,总体达到合格线。