本次是在java中对函数random的应用,用来生成一个六位数的不重复的验证码,
首先对题目进行分析,有哪些需求:
1.六位验证码
2.不重复,与之前生成的不重复。
3.要验证,也就是要进行对比。
对于需求目前就分析这么多,后续在做的过程还有一些细节就不多赘述了,了解了需求之后就是开始题目的思路。生成、存入、打印、对比、输出、
对于生成,我们可以用random函数进行生成,但要涉及到后续的存入我们要考虑以什么样的方式生成存入更加方便,int型对比起来方便但是存入需要的空间太大,而且定义的数组长度也过大,毕竟是六位如果再大用整型就更加不合适了,所以我们选用字符串来将这六位存入,对于验证码本身,由大小写字母,数字组成,他们两个有一个共性就是ASCLL 码都是数字,再联系到random函数生成随机数较为简单。这里我用的是将random生成数字放在一个函数中用Switchcase开关进行选择然后返回整数值,在在这个接收返回值的函数中将其转化为char型数据,然后将六个char型数据加起来就成了字符串。
public static int creatnum()//产生随机数的函数
{
int num1=0;
int a=(int)(Math.random()*3)+1;
if(a==1)
{
num1=(int)(Math.random()*10)+48;}//产生数字}
else if(a==2)
{
num1=(int)(Math.random()*26)+97;}//产生小写字母
else {
num1=(int)(Math.random()*26)+65;}//产生大写字母
return num1;
}
public static String creat()//产生随机验证码的函数
{
String s2="";
int i;
for(i=0;i<6;i++)
{
int num=creatnum();
char a=(char)num;
String s1=String.valueOf(a);
s2+=s1;
}//System.out.println(s2);
return s2;
}
产生验证码后就涉及到存储,因为他们6个一组组成字符串并且不知道要生成多少字符串所以这里用一个Arraylist数组进行存储,
public static void save()
{
int i;
arr.add(creat());
System.out.println(arr.get(arr.size()-1));
i=arr.size();
if(competepast()==1)
{input(i);}
else
{
System.out.println("验证码生成重复!已重新生成!");
save();
}
}然后就是输入验证码这里我没有在主函数中写因为后面如果验证码输入错误就要重新生成验证码在进行输入,所以写成了一个函数可以循环调用都写在数函数的话调用起来太麻烦了,
public static void input(int i)
{
System.out.println("请输入验证码:");
Scanner s1=new Scanner(System.in);
String a=s1.nextLine();
competeinput(a,i);
}
然后就是输入函数的对比看是否用户输入和产生验证码一致,这里就不得不说ArrayList数组的好处了他有一个函数equals可以直接对比是否相等,相等就打印出验证成功,如果不相等在重新在这个函数中调用save函数(就是生成并存储的函数)在重新生成,
public static void competeinput(String a,int i)
{
if(arr.get(i-1).equals(a)) {
System.out.println("验证成功!");}
else {
System.out.println("验证失败!请重新验证!");
save();}
}
最后就是和之前生成的验证码进行相比,这里就是用equals函数在遍历一下数组进行对比,这里要注意,遍历数组时for循环的跳出条件一定要是arr。size()-1因为当对比的时候你本身这个验证码已经生成了如果遍历到最后一个那不管前面怎样最后一个就是他本身一定和他本身相等那样就会不断循环跳不出程序出错,
public static int competepast()
{
int i;
int a=0;
for(i=0;i<arr.size();i++)
{
if(arr.get(i).equals(creat()))
{
a=0;
break;
}
else
a=1;
}
return a;
}
这样下来每个模块我们都写好了就剩相互之间的调用了下面是完整代码,
package javaclass1;
import java.util.Scanner;
import java.lang.reflect.Array;
import java.util.*;
public class RandomStr {
static ArrayList<String> arr=new ArrayList<String>();
public static void main(String[] args)
{
save();
}
public static void input(int i)
{
System.out.println("请输入验证码:");
Scanner s1=new Scanner(System.in);
String a=s1.nextLine();
competeinput(a,i);
}
public static void save()
{
int i;
arr.add(creat());
System.out.println(arr.get(arr.size()-1));
i=arr.size();
if(competepast()==1)
{input(i);}
else
{
System.out.println("验证码生成重复!已重新生成!");
save();
}
}
public static int competepast()
{
int i;
int a=0;
for(i=0;i<arr.size();i++)
{
if(arr.get(i).equals(creat()))
{
a=0;
break;
}
else
a=1;
}
return a;
}
public static String creat()
{
String s2="";
int i;
for(i=0;i<6;i++)
{
int num=creatnum();
char a=(char)num;
String s1=String.valueOf(a);
s2+=s1;
}//System.out.println(s2);
return s2;
}
public static int creatnum()
{
int num1=0;
int a=(int)(Math.random()*3)+1;
if(a==1)
{
num1=(int)(Math.random()*10)+48;}//产生数字}
else if(a==2)
{
num1=(int)(Math.random()*26)+97;}//产生小写字母
else {
num1=(int)(Math.random()*26)+65;}//产生大写字母
return num1;
}
public static void competeinput(String a,int i)
{
if(arr.get(i-1).equals(a)) {
System.out.println("验证成功!");}
else {
System.out.println("验证失败!请重新验证!");
save();}
}
}
我写的时候在最后面,输入错误验证码要重新生成验证码并打印出来的时候他会遍历整个集合然后全部打印出来,并且去掉for循环不打印程序就没法运行,哪怕是单个写后来找到原因是arraylist只能遍历集合,后来解决方案是我理了理,重新输出的时候集合最后一个是我要输出的新验证码然后我就直接:System.out,println(arr.get(arr.size()-1));用它本身集合的长度来打印。现在想想我感觉这个ArrayList他就像,链表一样这能顺序找下去没办法单独像数组那样靠位置找,要么你就遍历它不然要找中间的就等用for循环,但好在他比数组有可以不定义的长度。好了以上就是这次的random用法。
在这次又学到了个我把以前不太明白的:强制转化成字符串的四种方法,有兴趣可以去查查我就不说了。