【问题标题】:shuffle(rearrange randomly) the randomly generated passwordshuffle(随机重新排列)随机生成的密码
【发布时间】:2023-11-26 06:27:01
【问题描述】:

我正在生成一个随机密码。我的密码长度为 8 个字符,其中包含特殊字符。我需要保留first letter as alphabet,并需要将剩余的七个字符改组,使其成为mixture of alphanumeric + ascii characters

public String generatePassword() {
        int passwordLength = MAX_PASSWORD_LENGTH;
        StringBuffer password = new StringBuffer(passwordLength);
        //first character as an alphabet
        password.append(RandomStringUtils.randomAlphabetic(1)).toString();
        String alphaNumeric = RandomStringUtils.random(5, true, true);
        String asciiChars = RandomStringUtils.randomAscii(2);
        password.append(alphaNumeric).append(asciiChars);
        return password.toString();
    }

我需要一些帮助来随机播放最后 7 个字符。怎么做?

【问题讨论】:

  • 如果它们已经是随机的,为什么还需要洗牌?
  • Collections.shuffle 是你所需要的
  • 随机化/改组一个随机序列没有任何作用,它不会使它更随机。
  • 可以使用StringBuilder时请不要使用StringBuffer。
  • @Peter,感谢您建议我使用 StringBuilder

标签: java random passwords


【解决方案1】:

Java Collections API 有一个内置的 shuffle 方法可供您使用:请参阅here。 基本上,您需要从最后 7 个字符创建一个List,并将其传递给Collections.shuffle

【讨论】:

  • 感谢您的回答 Yuushi。
【解决方案2】:

如果您没有那么严格的要求,那么您可以随机附加字符:

Random random = new Random();
for (int i = 0; i < 7; i++) {
   if (random.nextBoolean()) {
       password.append(RandomStringUtils.random(1, true, true));
   } else {
       password.append(RandomStringUtils.randomAscii(1));
   }
}

如果您需要保证每种至少有一个,那么您可以添加一个简单的测试:

boolean hasAlphaNumeric = false;
boolean hasAscii = false;
while (hasAlphaNumeric == false || hasAscii == false) {
  Random random = new Random();
  for (int i = 0; i < 7; i++) {
    if (random.nextBoolean()) {
      password.append(RandomStringUtils.random(1, true, true));
      hasAlphaNumeric = true;
    } else {
      password.append(RandomStringUtils.randomAscii(1));
      hasAscii = true;
    }
  }
}

【讨论】: