如何生产22位不重复随机数
大家好:
如何生产22位不重复随机数,可以数字字母组合,不能够重复,谢谢!
[解决办法]
是否允许发生极其少量重复?比如十万个里面可能重复1个,还是绝对禁止发生重复?
[解决办法]
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楼的算比较不错了,虽然从逻辑上来说存在重复可能,但应该非常非常非常低了。
另外刚才还少问了一个问题,你是集群环境还是非集群环境?
[解决办法]
额,大牛请问为什么会有重复的情况?
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());
[解决办法]
注释忘了修改。抱歉
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());
[解决办法]
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);}
[解决办法]
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 uuid = UUID.randomUUID();System.out.println(u);
[解决办法]
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()); }}
[解决办法]
刚才疏忽了...献丑了
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位。
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编码都是可逆的,而且当前时间是唯一的,所以编码出来的结果应该是不会重复的
[解决办法]
private static String get9Str(int i) { StringBuilder sb = new StringBuilder(); sb.append(i); while(sb.length()!=9) sb.append(0);//不同的CPU使用不同的补足 return sb.toString(); }
[解决办法]
搬个板凳抓把瓜子来看下讨论
[解决办法]
仅供楼主参考!
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); } } */ }}
[解决办法]