【问题标题】:Generate Random String in java [duplicate]在java中生成随机字符串[重复]
【发布时间】: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,它是字母数字字符串。无法理解对上述代码进行哪些修改以仅生成大写字母字符串。请帮忙。。

【问题讨论】:

    标签: java string random secure-random


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 2013-08-06
        • 2010-12-07
        • 2013-03-02
        • 1970-01-01
        • 2015-08-16
        • 2014-02-05
        • 2020-06-22
        相关资源
        最近更新 更多