在java中生成随机字符串[重复]

Posted

技术标签:

【中文标题】在java中生成随机字符串[重复]【英文标题】:Generate Random String in java [duplicate] 【发布时间】:2017-01-06 10:00:32 【问题描述】:

我正在尝试使用 Secure Random 在 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 ;
     

输入参数是输出字符串的长度和id,它是字母数字字符串。无法理解对上述代码进行哪些修改以仅生成大写字母字符串。请帮忙。。

【问题讨论】:

【参考方案1】:

您的方法从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】:

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

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参数是生成的随机字符串的长度。

【讨论】:

【参考方案3】:

这是一个示例方法,它使用字符 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;

范围部分来自这个话题:Generating random integers in a specific range

【讨论】:

以上是关于在java中生成随机字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Java中生成字母数字随机字符串[重复]

如何在Java中生成随机字符串[重复]

在 Access 中生成随机字母数字字符串后检查重复项

在Java中生成一个随机字符串[关闭]

在Java中生成随机单词?

如何在java中生成一个随机的15位长[重复]