package com.opslab.util; import java.util.*; public final class RandomUtil { public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String NUMBERCHAR = "0123456789"; /** * 生成制定范围内的随机数 * * @param scopeMin * @param scoeMax * @return */ public static int integer(int scopeMin, int scoeMax) { Random random = new Random(); return (random.nextInt(scoeMax) % (scoeMax - scopeMin + 1) + scopeMin); } /** * 返回固定长度的数字 * * @param length * @return */ public static String number(int length) { StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < length; i++) { sb.append(NUMBERCHAR.charAt(random.nextInt(NUMBERCHAR.length()))); } return sb.toString(); } /** * 返回一个定长的随机字符串(只包含大小写字母、数字) * * @param length 随机字符串长度 * @return 随机字符串 */ public static String String(int length) { StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < length; i++) { sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length()))); } return sb.toString(); } /** * 返回一个定长的随机纯字母字符串(只包含大小写字母) * * @param length 随机字符串长度 * @return 随机字符串 */ public static String MixString(int length) { StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < length; i++) { sb.append(ALLCHAR.charAt(random.nextInt(LETTERCHAR.length()))); } return sb.toString(); } /** * 返回一个定长的随机纯大写字母字符串(只包含大小写字母) * * @param length 随机字符串长度 * @return 随机字符串 */ public static String LowerString(int length) { return MixString(length).toLowerCase(); } /** * 返回一个定长的随机纯小写字母字符串(只包含大小写字母) * * @param length 随机字符串长度 * @return 随机字符串 */ public static String UpperString(int length) { return MixString(length).toUpperCase(); } /** * 生成一个定长的纯0字符串 * * @param length 字符串长度 * @return 纯0字符串 */ public static String ZeroString(int length) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { sb.append('0'); } return sb.toString(); } /** * 根据数字生成一个定长的字符串,长度不够前面补0 * * @param num 数字 * @param fixdlenth 字符串长度 * @return 定长的字符串 */ public static String toFixdLengthString(long num, int fixdlenth) { StringBuffer sb = new StringBuffer(); String strNum = String.valueOf(num); if (fixdlenth - strNum.length() >= 0) { sb.append(ZeroString(fixdlenth - strNum.length())); } else { throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!"); } sb.append(strNum); return sb.toString(); } /** * 根据数字生成一个定长的字符串,长度不够前面补0 * * @param num 数字 * @param fixdlenth 字符串长度 * @return 定长的字符串 */ public static String toFixdLengthString(int num, int fixdlenth) { StringBuffer sb = new StringBuffer(); String strNum = String.valueOf(num); if (fixdlenth - strNum.length() >= 0) { sb.append(ZeroString(fixdlenth - strNum.length())); } else { throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!"); } sb.append(strNum); return sb.toString(); } /** * 每次生成的len位数都不相同 * * @param param * @return 定长的数字 */ public static int getNotSimple(int[] param, int len) { Random rand = new Random(); for (int i = param.length; i > 1; i--) { int index = rand.nextInt(i); int tmp = param[index]; param[index] = param[i - 1]; param[i - 1] = tmp; } int result = 0; for (int i = 0; i < len; i++) { result = result * 10 + param[i]; } return result; } /** * 从指定的数组中随机数组中的某个元素 */ public static <T> T randomItem(T[] param) { int index = integer(0, param.length); return param[index]; } /** * 实现一个简单的字符串乘法 * @param str * @param multiplication * @return */ private static String strMultiplication(String str,int multiplication){ StringBuffer buffer = new StringBuffer(); for (int i = 0; i < multiplication; i++) { buffer.append(str); } return buffer.toString(); } /** * 从指定的数组中按照指定比例返回指定的随机元素 * @param param * @param percentum * @param <T> * @return */ public static <T> T randomItem(T[] param,double[] percentum){ int length = percentum.length; Integer[] ints = ArrayUtil.doubleBitCount(percentum); int max = Collections.max(Arrays.asList(ints)); int[] arr = new int[length]; int sum = 0; Map map = new HashMap(length); int multiple = Integer.parseInt("1"+strMultiplication("0",max)); for (int i = 0; i < length; i++) { int temp = (int)(percentum[i] * multiple); arr[i] = temp; if(i == 0){ map.put(i,new int[]{1,temp}); }else{ map.put(i,new int[]{sum,sum+temp}); } sum += temp; } int indexSum = integer(1,sum); int index =-1; for (int i = 0; i < length; i++) { int[] scope = (int[]) map.get(i); if(indexSum ==1 ){ index = 0; break; } if(indexSum > scope[0] && indexSum <= scope[1]){ index =i; break; } } if(index == -1){ throw new RuntimeException("随机失败"); }else{ return param[index]; } } /** * 返回一个UUID * * @return 小写的UUID */ public static String uuid() { UUID uuid = UUID.randomUUID(); String s = uuid.toString(); return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24); } /** * 返回一个UUID * * @return 大写的UUID */ public static String UUID() { UUID uuid = UUID.randomUUID(); String s = uuid.toString(); String temp = s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24); return temp.toUpperCase(); } /** * 返回一个有序列的uuid编码 * 前11位为时间(毫秒) * 中间4位为主机特征码 * 剩下的保证其唯一性 * * @return */ public static String squid() { Long date = new Date().getTime(); String s = UUID.randomUUID().toString(); String str = Long.toHexString(date); String result = str + OpslabConfig.HOST_FEATURE + s.substring(17, 18) + s.substring(19, 23) + s.substring(24); return result.toUpperCase(); } }