递归随机密码生成器



我正在尝试在Java中编写递归密码生成程序,但该控制台吐出了每个密码的组合,而不是返回一个随机生成的密码,而只是保持下去。

>

*另外,我需要在密码中至少有一个大写字母,这就是为什么我随机生成一个或零的原因。

问题:如何使此递归方法仅打印出一个随机生成的randomSize长度的密码?如何根据randomCapital是否为1?

代码:

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);
    }
}

最新更新