如何仅使用 java 使用特殊字符(包括 space)创建大小为 5 的非重复随机字符串?

How to create non-repeating Random String of size 5 using special characters (including space) only using java?

我正在尝试仅使用特殊字符创建大小为 5 的字符串,例如 -

~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?

其中还包括 space

下面是我试过的代码行:-

public static String randomSpecialCharacterString() {
    char[] possibleCharacters = (new String("~`!@ # $ %^&*()-_=+[{]}\|;:\'\",<.>/?")).toCharArray();
    String randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length-1, false, false, possibleCharacters, new SecureRandom());
    return randomStr;
}

但是,它没有返回非重复字符串。而且,应该返回带有 space 的字符串。

例如 - @# ?/!)( +

我已经检查了所有可能的重复项。

有 2 个错误:字符列表和计数值中缺少 space 个字符(...长度为 1 意味着永远不会选择列表中的最后一个字符)。

调用中的非重复字符串:

private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();

public static String randomSpecialCharacterString() {
  String randomStr;
  do {
    randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
  } while(used.contains(randomStr));
  used.add(randomStr);
  return randomStr;
}

字符串中的非重复字符:

private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static final SecureRandom rand = new SecureRandom();

public static String randomSpecialCharacterString() {
  final StringBuilder randomStr = new StringBuilder(5);

  IntStream.range(0, 5).forEach(i -> {
    String randomChar;
    do {
      randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
    } while (randomStr.indexOf(randomChar) >= 0);
    randomStr.append(randomChar);

  });
    int spacePosition = rand.nextInt(5);
    return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
}

两者合并:

private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();

public static String randomSpecialCharacterString() {
  String randomStr;
  do {
    randomStr = randomSpecialCharacterNonRepeatedString();
  } while (used.contains(randomStr));
  used.add(randomStr);
  return randomStr;
}

  public static String randomSpecialCharacterNonRepeatedString() {
    final StringBuilder randomStr = new StringBuilder(5);

    IntStream.range(0, 5).forEach(i -> {
      String randomChar;
      do {
        randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters,
            new SecureRandom());
      } while (randomStr.indexOf(randomChar) >= 0);
      randomStr.append(randomChar);

    });
    int spacePosition = rand.nextInt(5);
    return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
  }

请注意此代码不是线程安全的。

假设 RESULT_STR_LENGTH 是 5:

  1. 如果你不想重复,只需随机化 possibleCharacters:

    的顺序
    char[] shuffledCharacters = new char[possibleCharacters.length];
    Collections.shuffle(Arrays.asList(possibleCharacters)).toArray(shuffledCharacters);
    
  2. 如果 space 必须在结果中,则用 space 替换随机字符(如果你不想重复 spaces,使确保 possibleCharacters 不包含任何 spaces):

    shuffledCharacters[new Random().nextInt(RESULT_STR_LENGTH)] = ' ';
    
  3. 然后 return 前 RESULT_STR_LENGTH 个字符作为字符串:

    return new String(shuffledCharacters, 0, RESULT_STR_LENGTH);