当大佬给我这个需求的时候我的心里是有点小确幸啊,这还不简单吗,用Java的Math.random就可以生成随机数了,网上一大堆的博文,还有些是uuid生成字母家数字的,而且这种方法生成时间需要10秒以上,还有一点生成一千万的时候有重复出现的,这种方法绝壁不行,上代码:
public class Poiread {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
List list=new ArrayList();
for(int i=0;i<10000000;i++){
String str=Poiread.genRandomNum();
list.add(str);
}
long starttime=System.currentTimeMillis();
System.out.println("去重前的大小"+list.size());
List newlist=new ArrayList(new HashSet(list));
System.out.println("去后大小"+newlist.size());
long endtime=System.currentTimeMillis();
System.out.println(endtime-starttime);
}
public static String genRandomNum(){
int maxNum = 36;
int i;
int count = 0;
char[] str = { '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
StringBuffer sb = new StringBuffer("");
Random r = new Random();
while(count < 8){
i = Math.abs(r.nextInt(maxNum));
if (i >= 0 && i < str.length) {
sb.append(str[i]);
count ++;
}
}
return sb.toString();
}
}
结果是这样的:
一千万8位数的时候有10多个重复的,需求是一个都不行,而且生成的时间是12秒钟(对于程序来说过来过了几个世纪啊),这咋整,后来就想着用递增的方法生成,8位数的第一位是字母开头的,A1000000,一直递增到A9999999 ,再换成B1000000...这样一直循环,到Z9999999,我算了一下这样可以生成89999999个不同的八位数,而且不会有重复的(机智如我)
再上一波代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class CreateNumber extends Thread{
public static void main(String[] args) {
CreateNumber c=new CreateNumber();
c.start();
CreateNumber c1=new CreateNumber();
c1.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
long startlong=System.currentTimeMillis();
List list=getNumbet(1000);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endlong=System.currentTimeMillis();
System.out.println(endlong-startlong);
System.out.println("去重前listsize"+list.size());
System.out.println(list.toString());
}
public static List getNumbet(int loopNumber){
List list=new ArrayList();
String[] ch = { "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"};
int number=1000000;
int c=0;
String sb=null;
for(int i=0;i9){//如果字母后面满了,就换下一个字母组合,再把字母后面的值全部归零
c++;
number=1000000;
}
list.add(ch[c]+number);
number++;
}
return list;
}
}
结果是这样的:
只用10多毫秒,完美!那么问题来了,足足有8千多万不重复的八位数!那么问题来了,有些盆友要问,超过了8千万呢,那要保证不不重复,我的想法是再8位数的第二位再加字母,AB100000 ----- AB999999 然后AC1000000 ------AC100000 ,就这样我都懒的算这可以生成多少位不重复的八位数的,如果是生成32wei位的随机数,UUID生成的上亿都是几率很小的,当然我的需求是这样的。有想法的小伙伴欢迎吐槽!