热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JAVARandom函数的应用随机生成验证码

本次是在java中对函数random的应用,用来生成一个六位数的不重复的验证码,首先对题目进行分析,有哪些需求:1.六位验证码2.不重复,与之前生成的不重复。3.要验证,也就是要进

本次是在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 {
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 arr=new ArrayList();
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 {
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用法。

在这次又学到了个我把以前不太明白的:强制转化成字符串的四种方法,有兴趣可以去查查我就不说了。

 



推荐阅读
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
已1注2销
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有