首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

怎么生产22位不重复随机数

2012-03-12 
如何生产22位不重复随机数大家好:如何生产22位不重复随机数,可以数字字母组合,不能够重复,谢谢![解决办法]

如何生产22位不重复随机数
大家好:

  如何生产22位不重复随机数,可以数字字母组合,不能够重复,谢谢!

[解决办法]
是否允许发生极其少量重复?比如十万个里面可能重复1个,还是绝对禁止发生重复?
[解决办法]

Java code
        char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};                String tStr = String.valueOf(System.currentTimeMillis());        System.out.println(tStr);        StringBuilder sb = new StringBuilder();        /*从当前时间的毫秒获取12位数*/        for(int i=1;i<tStr.length();i++)                sb.append(letters[tStr.charAt(i)-'0']);                /*随机生成另外十位,由于前面的12位数不可能重复,所以生成的串是不重复的*/        for(int i=0;i<10;i++)            sb.append(letters[(int) (Math.random()*10)]);        System.out.println(sb.toString());
[解决办法]
3楼的算比较不错了,虽然从逻辑上来说存在重复可能,但应该非常非常非常低了。

另外刚才还少问了一个问题,你是集群环境还是非集群环境?
[解决办法]
额,大牛请问为什么会有重复的情况?
探讨

3楼的算比较不错了,虽然从逻辑上来说存在重复可能,但应该非常非常非常低了。

另外刚才还少问了一个问题,你是集群环境还是非集群环境?

[解决办法]
那把毫秒数全用上吧。
Java code
        char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};                String tStr = String.valueOf(System.currentTimeMillis());        StringBuilder sb = new StringBuilder();        /*从当前时间的毫秒获取12位数*/        for(int i=0;i<tStr.length();i++)                sb.append(letters[tStr.charAt(i)-'0']);                /*随机生成另外十位,由于前面的12位数不可能重复,所以生成的串是不重复的*/        for(int i=0;i<9;i++)            sb.append(letters[(int) (Math.random()*10)]);        System.out.println(sb.toString());
[解决办法]
注释忘了修改。抱歉
Java code
        char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};                String tStr = String.valueOf(System.currentTimeMillis());        StringBuilder sb = new StringBuilder();        /*从当前时间的毫秒获取13位数*/        for(int i=0;i<tStr.length();i++)                sb.append(letters[tStr.charAt(i)-'0']);                /*随机生成另外九位,由于前面的13位数不可能重复,所以生成的串是不重复的*/        for(int i=0;i<9;i++)            sb.append(letters[(int) (Math.random()*10)]);        System.out.println(sb.toString());
[解决办法]
Java code
boolean flag=false; StringBuilder sb = new StringBuilder();char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};for(int i=0;i<22;i++){        do{               int temp=(int)(Math.random()*letters.length());               sb.append(letters[temp]);            for(int i=0;i<sb.length();i++){                if(letters[temp]==(sb.charAt(i))){                    flag=true;                    break;                }                flag=false;            }        }while(flag);}
[解决办法]
Java code
boolean flag=false; StringBuilder sb = new StringBuilder();char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};for(int i=0;i<22;i++){        do{               int temp=(int)(Math.random()*letters.length());               sb.append(letters[temp]);            for(int i=0;i<sb.length();i++){                if(letters[temp]==(sb.charAt(i))){                    flag=true;                    sb.deletecharAt(i);//如果加进去的是重复的,就删除它                    break;                }                flag=false;            }        }while(flag);}
------解决方案--------------------


探讨
额,大牛请问为什么会有重复的情况?.

[解决办法]
用uuid呢?

Java code
UUID uuid = UUID.randomUUID();System.out.println(u);
[解决办法]
探讨
用uuid呢?


Java code
UUID uuid = UUID.randomUUID();
System.out.println(u);


可能会超位、把 “ - ” 截取掉

或者随机截取uuid只剩下16位嘞?

[解决办法]
探讨

Java code


char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};

String tStr = String.valueOf(System.currentTimeMillis());
System.out.println(tStr);
……

[解决办法]
如果使用锁,这样应该没问题吧?谢谢
Java code
public class SerGenerator {        private static int dis;    private static Object lock = new Object();    private final static char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};    public static String getSer()    {        String tStr = String.valueOf(System.currentTimeMillis());        StringBuilder sb = new StringBuilder();        /*从当前时间的毫秒获取13位数*/        for(int i=0;i<tStr.length();i++)                sb.append(letters[tStr.charAt(i)-'0']);                /*随机生成另外八位,由于前面的13位数不可能重复,所以生成的串是不重复的*/        for(int i=0;i<8;i++)            sb.append(letters[(int) (Math.random()*10)]);                synchronized(lock)        {            sb.append(dis++);        }        return sb.toString();    }    public static void main(String[] args) {            System.out.println(getSer());    }}
[解决办法]
刚才疏忽了...献丑了
Java code
public class SerGenerator {        private static int dis;    private static Object lock = new Object();    private final static char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'};    public static String getSer()    {        String tStr = String.valueOf(System.currentTimeMillis());        StringBuilder sb = new StringBuilder();        /*从当前时间的毫秒获取13位数*/        for(int i=0;i<tStr.length();i++)                sb.append(letters[tStr.charAt(i)-'0']);                synchronized(lock)        {            sb.append(get9Str(dis++));        }        return sb.toString();    }    private static String get9Str(int i)    {        StringBuilder sb = new StringBuilder();        sb.append(i);        while(sb.length()!=9)            sb.append(0);        return sb.toString();    }    public static void main(String[] args) {            System.out.println(getSer());    }}
[解决办法]
把当前的时间的16位进制当成字符串先进行des编码,再进行Base64编码,然后去掉最后的两个等号
这样的结果刚好是22位。
Java code
try {            String time = Long.toHexString(System.currentTimeMillis());            KeyGenerator generator = KeyGenerator.getInstance("DES");            SecretKey key = generator.generateKey();            Cipher cipher = Cipher.getInstance("DES");            cipher.init(Cipher.ENCRYPT_MODE, key);            byte[] des_byte = cipher.doFinal(time.getBytes());            String final_String = new BASE64Encoder().encode(des_byte);            final_String = final_String.replace("==", "");            System.out.println(final_String);        } catch (Exception e) {            e.printStackTrace();        }
[解决办法]
因为BASE64编码和DES编码都是可逆的,而且当前时间是唯一的,所以编码出来的结果应该是不会重复的


[解决办法]

Java code
    private static String get9Str(int i)    {        StringBuilder sb = new StringBuilder();        sb.append(i);        while(sb.length()!=9)            sb.append(0);//不同的CPU使用不同的补足        return sb.toString();    }
[解决办法]
搬个板凳抓把瓜子来看下讨论
[解决办法]
仅供楼主参考!
Java code
package com.student.test3;import java.security.SecureRandom;class RandomString{    private static final String POSSIBLE_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";    public String getRandomString(int length)    {        StringBuffer sbf = new StringBuffer();        SecureRandom random = new SecureRandom();        for (int i = 0; i < length; i++)        {            sbf.append(POSSIBLE_CHARS.charAt(random.nextInt(POSSIBLE_CHARS                    .length())));        }        return sbf.toString();    }}public class Ansewer66{    public static void main(String[] args)    {        // TODO Auto-generated method stub        System.out.println(new RandomString().getRandomString(22));        // 测试        /*         * for (int i = 0; i < 2000000; i++) { String s = new         * RandomString().getRandomString(10); Set<String> check = new         * HashSet<String>(); if (check.contains(s)) { throw new         * IllegalStateException("重复字符被发现: " + s); } else {         * System.out.println("产生第"+(i+1)+"个字符:"+s); check.add(s); } }         */    }}
[解决办法]

热点排行