package message.utils; import org.apache.commons.lang.ArrayUtils; import java.util.Random; /** * 随机生成数字或者字符串的工具类. * * @author sunhao(sunhao.java@gmail.com) * @version V1.0 * @createTime 2012-4-24 下午08:25:57 */ public class RandomUtils { private static final String LETTER_LOWER = "abcdefghijklmnopqrstuvwxyz"; private static final String LETTER_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String DIGIT = "0123456789"; /** * 私有化构造器 */ private RandomUtils(){} /** * 获取长度为length的随机数 * * @param length 长度 * @return 获取的随机数(String) */ public static String getRandomNum(int length) { if(length < 1){ return StringUtils.EMPTY; } long returnRandom = 0; long min = 1; long max = 1; for (int i = 0; i < length - 1; i++) { min *= 10; } for (int j = 0; j < length; j++) { max *= 10; } while (returnRandom <= min) { returnRandom = (long) (Math.random() * max); } return Long.toString(returnRandom); } /** * 生成随机数字 * * @param length 生成的密码的总长度 * @return 数字的字符串 */ public static String randomNum(int length) { if(length < 1){ return StringUtils.EMPTY; } // 10个数字 final int maxNum = 10; int i; // 生成的随机数 int count = 0; // 生成的密码的长度 char[] str = DIGIT.toCharArray(); StringBuffer tempString = new StringBuffer(100); Random random = new Random(); while (count < length) { /** * 生成随机数,取绝对值,防止生成负数 * * Random.nextInt(int num) 返回一个在[0, n) * 所以不会造成数组下标越界的情况 */ i = Math.abs(random.nextInt(maxNum)); if (i >= 0 && i < str.length) { tempString.append(str[i]); count++; } } return tempString.toString(); } /** * 生成随机字符串 * * @param length 生成的密码的总长度 * @return 字符串(大小写字母+数字) */ public static String randomString(int length, boolean lower, boolean upper, boolean digit) { if(length < 1){ return StringUtils.EMPTY; } //26个字母*2 + 10个数字 final int maxNum = 62; int i; // 生成的随机数 int count = 0; // 生成的密码的长度 char[] str = {}; if(lower) str = ArrayUtils.addAll(str, LETTER_LOWER.toCharArray()); if(upper) str = ArrayUtils.addAll(str, LETTER_UPPER.toCharArray()); if(digit) str = ArrayUtils.addAll(str, DIGIT.toCharArray()); StringBuffer tempString = new StringBuffer(100); Random random = new Random(); while (count < length) { /** * 生成随机数,取绝对值,防止生成负数 * * Random.nextInt(int num) 返回一个在[0, n) * 所以不会造成数组下标越界的情况 */ i = Math.abs(random.nextInt(maxNum)); if (i >= 0 && i < str.length) { tempString.append(str[i]); count++; } } return tempString.toString(); } /** * 生成随机字符串 * * @param length 生成的密码的总长度 * @return 字符串(大小写字母+数字) */ public static synchronized String randomString(int length) { if (length < 1) { return StringUtils.EMPTY; } Random randGen = new Random(); char[] numbersAndLetters = ArrayUtils.addAll(null, DIGIT.toCharArray()); numbersAndLetters = ArrayUtils.addAll(numbersAndLetters, LETTER_LOWER.toCharArray()); numbersAndLetters = ArrayUtils.addAll(numbersAndLetters, DIGIT.toCharArray()); numbersAndLetters = ArrayUtils.addAll(numbersAndLetters, LETTER_UPPER.toCharArray()); char[] randBuffer = new char[length]; for (int i = 0; i < randBuffer.length; i++) { randBuffer[i] = numbersAndLetters[randGen.nextInt(72)]; } return new String(randBuffer); } }