在Java中生成随机字符串

Generate Random String in java

本问题已经有最佳答案,请猛点这里访问。

我试图在Java中使用安全随机变量生成一个字符串。目前,我可以用特殊字符生成字母数字字符串,但我想要一个只有大写字母的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
  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 ;
    }

输入参数是输出字符串的长度&id,其中字母数字字符串。无法理解要对上述代码进行哪些修改以生成大写字母字符串。请帮助…


下面是我编写和使用的生成器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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参数是生成的随机字符串的长度。


您的方法从id参数中随机选择字符。如果希望这些字符仅为大写字母,则传递一个包含这些字符的字符串:

1
String randomCode = createRandomCode(length,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");

如果要避免重复,则不能随意选择字符。您将要洗牌并挑选出第一个n字符:

1
2
3
4
5
6
7
8
9
10
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只是为了好玩,下面是实现原始随机代码生成器(允许重复)的另一种方法:

1
2
3
4
5
6
7
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());
}


下面是一个示例方法,它使用了字符a到z的int范围(同时该方法避免了String中的重复字符):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
}

范围部分来自这个主题:在特定范围内生成随机整数