发布于2021-01-01 16:30 阅读(895) 评论(0) 点赞(15) 收藏(3)
一 、使用场景。
1、举办抽奖活动抽奖卡刮的那个码。
2、验证码也可以用。
二、上代码
import java.util.HashSet;
import java.util.Random;
public class RandomNumbers {
/**
* 随机指定范围内N个不重复的flag位(数字+字母)组合 利用HashSet的特征,只能存放不同的值
* @param set
* set 随机数结果集
*/
public static int ff=1;
public static void randomSet(HashSet<String> set) {
int flag = 6;//验证码的位数,
char[] beforeShuffle = {
'0','1', '2', '3', '4', '5', '6', '7', '8', '9',
'a','b', 'd', 'c', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
char[] c = new char[flag];
Random random = new Random();
String s="";
for (int i = 0; i < flag; i++) {
c[i] = beforeShuffle[random.nextInt(62)];
s+=String.valueOf(c[i]);
}
System.out.println("验证码为:"+ff+"--------"+s);
ff++;
set.add(s);// 将不同的数存入HashSet中
int setSize = set.size();
// System.out.println("size: "+setSize+"----------n: "+n);
// 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小
}
public static void main(String[] args) {
int n = 100000;//生成数量
HashSet<String> numbers = new HashSet<String>();//用HashSet存储,存放不重复的值
while (numbers.size() < n) {
randomSet(numbers);// 递归
}
}
}
三、看看效果
四、注意问题
1.原本我写的是递归,后来改成了循环。由于递归调用次数过多,堆栈溢出。
堆栈的大小是系统控制的,无法改变。如果递归调用出现问题,可以考虑采取循环的方式来解决。
2.生成的验证码中的小写L,大写i ,以及数字1 写入excel中后三个字符非常相似。所有在实际应用中最好去掉大写字母i,就算用idea里面显示区别很大的Microsoft YaHei UI 一样的字体 还是很相似。肉眼区分不太出。
原文链接:https://blog.csdn.net/yuchenai/article/details/112027196
链接:http://www.javaheidong.com/blog/article/46029/022baf994b66212f029c/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!