本来是个很简单的事儿,一堆水文章的,实在看不下去了。
public class RandomUtil {
public static final Random RANDOM = new Random();
public static final String UPPER_CHAR = "QWERTYUIOPASDFGHJKLZXCVBNM";
public static final String LOWER_CHAR = "qwertyuiopasdfghjklzxcvbnm";
public static final String DIGITAL_CHAR = "0123456789";
public static String randomPassword(int minLength, int maxLength) {
// random length
int len = RANDOM.nextInt(maxLength - minLength) + minLength;
char[] chars = new char[len];
// pools
int[] boundPool = {26, 26, 10};
List<Boolean> flagPool = Arrays.asList(false, false, false);
String[] charPool = {UPPER_CHAR, LOWER_CHAR, DIGITAL_CHAR};
BiConsumer<Integer, Integer> consumer = (i, index) -> {
chars[i] = charPool[index].charAt(RANDOM.nextInt(boundPool[index]));
flagPool.set(index, true);
};
for (int i = 0; i < len; i++) {
// 防止最后没有包含所有字符类型
if (i >= len - 2 && flagPool.contains(false)) {
consumer.accept(i, flagPool.indexOf(false));
} else {
consumer.accept(i, RANDOM.nextInt(3));
}
}
return new String(chars);
}
public static void main(String[] args) {
System.out.println(randomPassword(8, 12));
}
}