2015-05-06 3 views
0

Я пытаюсь написать рекурсивную программу генерации паролей в 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); 
    } 
} 
+0

[ 'rand.nextInt (1)'] (http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt%28int%29) возвращает '0' со 100% -ной вероятностью, потому что он« возвращает псевдослучайное равномерно распределенное значение int между 0 (включительно) и указанным значением (исключительным) ». –

+0

@MickMnemonic, ооооооооооооо. Я всегда это испортил. Как насчет вывода моего кода? Все, что я получаю что-то вроде этого: aaaaaaaaaa9woi aaaaaaaaaa9woj aaaaaaaaaa9wok aaaaaaaaaa9wol aaaaaaaaaa9wom ........ Как я могу сделать это вернуть только один пароль? – Jason

+0

Просто обратите внимание, что 'Random' не является безопасным - используйте этот код только для упражнений. – SilverlightFox

ответ

0

Вы генерируя все возможные комбинации паролей, потому что вы собираетесь через каждое значение в массиве полукокса на каждом уровне рекурсивного стека вместо того, чтобы выбрать случайное значение для массив.

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

Вместо этого вы можете использовать 'boolean randomCapital = rand.nextBoolean()', потому что 'nextInt (1)' всегда возвращает '0'. Аналогично, 'rand.nextInt (chars.length-1)' никогда не выбирает последний индекс 'chars'. –

+0

Да, это лучший вариант – zuzumumba

Смежные вопросы