递归随机密码生成器

Recursive random password generator

我正尝试在 java 中编写一个递归密码生成程序,但控制台没有返回一个随机生成的密码,而是吐出每个密码组合并继续运行。

*另外,我的密码必须至少有一个大写字母,这就是我随机生成一个或零的原因。

问题:如何让这个递归方法只打印出一个随机生成的 randomSize 长度的密码?如何根据 randomCapital 是否为 1 将 char 设为大写?

代码:

public class PasswordGenerator{

  public static void main(String[] args) {

      Random rand = new Random();
      int randomSize = rand.nextInt((13) + 8);

      generatePassword("", 0, randomSize);

  }


  public static char[]chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
    'n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5',
    '6','7','8','9','!','@','$','%','^','&'};

  public static void generatePassword(String password, int position, int size)
  {
      Random rand = new Random();
      int randomCapital = rand.nextInt(1);

      if(position < size && randomCapital == 0)
      {
          for(char ch: chars)
          {
              generatePassword(password + ch, position + 1, size);
          }
          if(position < size && randomCapital == 1)
          {
             for(char ch: chars)
             {
                //how can I make this char capital if randomCapital is 1?
                generatePassword(password + ch, position + 1, size);
             }
         }          
      }
      else
          System.out.println(password);
   }
}

您正在生成每个密码组合,因为您要在递归堆栈的每个级别遍历 char 数组中的每个值,而不是为数组选择一个随机值。

public static void main(String[] args) {

    Random rand = new Random();
    int randomSize = rand.nextInt((13) + 8);

    String password = generatePassword(rand, "", 0, randomSize);
    System.out.println(password);
}


public static char[]chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
    'n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5',
    '6','7','8','9','!','@','$','%','^','&'};

//I think it makes more sense returning the generated string and passing along the random number generator instead of recreating it at each recursive call
public static String generatePassword(Random rand, String password, int position, int size)
{
    boolean isLowerCase = rand.nextBoolean();
    int randomChar = rand.nextInt(chars.length);
    char c = chars[randomChar];
    if(position == size) //base case
        return pasword;
    if(isLowerCase)
    {
        generatePassword(rand, password + chars[randomChar], position + 1, size);
    }
    else //its either upper or lower case
    {
        generatePassword(rand, password + Char.toUpperCase(c), position + 1, size);
    }
}