Java如何生成千万级别的不重复的八位数

Java生成千万个的八位数


当大佬给我这个需求的时候我的心里是有点小确幸啊,这还不简单吗,用Java的Math.random就可以生成随机数了,网上一大堆的博文,还有些是uuid生成字母家数字的,而且这种方法生成时间需要10秒以上,还有一点生成一千万的时候有重复出现的,这种方法绝壁不行,上代码:

public class Poiread {
	public static void main(String[] args) throws ScriptException, NoSuchMethodException {
		

	    List<String> list=new ArrayList<String>();
		for(int i=0;i<10000000;i++){
			String str=Poiread.genRandomNum();
			list.add(str);
		}
		long starttime=System.currentTimeMillis();
		System.out.println("去重前的大小"+list.size());
		List<String> newlist=new ArrayList<String>(new HashSet<String>(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<String> 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<String> getNumbet(int loopNumber){
		List<String> list=new ArrayList<String>();
		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;i<loopNumber;i++){
			sb=ch[c]+number;
			if(sb.length()>9){//如果字母后面满了,就换下一个字母组合,再把字母后面的值全部归零
				c++;
				number=1000000;
			}
			list.add(ch[c]+number);
			number++;
		}
		return list;
	}
}

结果是这样的:

只用10多毫秒,完美!那么问题来了,足足有8千多万不重复的八位数!那么问题来了,有些盆友要问,超过了8千万呢,那要保证不不重复,我的想法是再8位数的第二位再加字母,AB100000  ----- AB999999 然后AC1000000 ------AC100000 ,就这样我都懒的算这可以生成多少位不重复的八位数的,如果是生成32wei位的随机数,UUID生成的上亿都是几率很小的,当然我的需求是这样的。有想法的小伙伴欢迎吐槽!

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页