我正在尝试使用安全随机在Java中的大写A-Z之间生成一个字符串。目前我能够生成一个带有特殊字符的字母数字字符串,但我想要一个只包含大写字母的字符串。
public String createRandomCode(int codeLength, String id){
char[] chars = id.toCharArray();
StringBuilder sb = new StringBuilder();
Random random = new SecureRandom();
for (int i = 0; i < codeLength; i++) {
char c = chars[random.nextInt(chars.length)];
sb.append(c);
}
String output = sb.toString();
System.out.println(output);
return output ;
}
输入参数是输出字符串的长度&amp; id是whhich是字母数字字符串。无法理解对上面的代码进行哪些修改以仅生成大写字母字符串。请帮忙..
答案 0 :(得分:3)
这是我编写和使用的生成器:
public class RandomGenerator {
private static final String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String generateRandom(int length) {
Random random = new SecureRandom();
if (length <= 0) {
throw new IllegalArgumentException("String length must be a positive integer");
}
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(characters.charAt(random.nextInt(characters.length())));
}
return sb.toString();
}
}
在numChars
字符串中,您可以添加要包含的任何字符。 int length
参数是生成的随机字符串的长度。
答案 1 :(得分:2)
您的方法从id
参数中随机选择字符。如果您希望那些只是大写字母,那么传递一个包含这些字符的字符串:
String randomCode = createRandomCode(length, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
编辑如果您想避免重复,则无法随意选择字符。您希望将它们随机播放并选出第一个n
个字符:
public String createRandomCode(int codeLength, String id) {
List<Character> temp = id.chars()
.mapToObj(i -> (char)i)
.collect(Collectors.toList());
Collections.shuffle(temp, new SecureRandom());
return temp.stream()
.map(Object::toString)
.limit(codeLength)
.collect(Collectors.joining());
}
编辑2 只是为了好玩,这是实现原始随机代码生成器的另一种方式(允许重复):
public static String createRandomCode(int codeLength, String id) {
return new SecureRandom()
.ints(codeLength, 0, id.length())
.mapToObj(id::charAt)
.map(Object::toString)
.collect(Collectors.joining());
}
答案 2 :(得分:0)
这是一个使用字符A到Z的int范围的示例方法(此方法也避免了String
中的重复字符):
public String createRandomCode(final int codeLength) {
int min = 65;// A
int max = 90;// Z
StringBuilder sb = new StringBuilder();
Random random = new SecureRandom();
for (int i = 0; i < codeLength; i++) {
Character c;
do {
c = (char) (random.nextInt((max - min) + 1) + min);
} while (sb.indexOf(c.toString()) > -1);
sb.append(c);
}
String output = sb.toString();
System.out.println(output);
return output;
}