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

> 你们看到这个是不是在想,这还不简单吗,用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();

}

}

**结果是这样的:**

![20181229163308274.png][]

一千万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;i

sb=ch[c]+number;

if(sb.length()>9){//如果字母后面满了,就换下一个字母组合,再把字母后面的值全部归零

c++;

number=1000000;

}

list.add(ch[c]+number);

number++;

}

return list;

}

}

**结果是这样的:**

![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzU2ODY3_size_16_color_FFFFFF_t_70][]

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

[20181229163308274.png]: /images/1613124076338.png

[watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzU2ODY3_size_16_color_FFFFFF_t_70]: /images/1613124063375.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值