2016-04-23 4 views
1

Я надеюсь, кто-то может указать мне в сторону выяснения, почему мой код не создает случайную строку буквенных символов каждый раз, когда он вызывается в основном классе.Не генерирование случайных символов при каждом вызове

Вот мой пароль рандомизации класс:

import java.util.Random; 

public class PasswordRandomizer { 
    private Random random = new Random(); 
    private int length; 
    private int num; 
    private String password = ""; 
    private String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    private char character; 

    public PasswordRandomizer(int length) { 
     // Initialize the variable 
     this.length = length; 
    } 

    public String createPassword() { 
     while (length > 0) {   
      num = this.random.nextInt(26); 
      character = alphabet.charAt(num); 
      password += character; 
      length--; 
     } 
     return password; 
    } 
} 

И для каждого вызова, это производит только один и тот же пароль. Например:

public class Program { 
    public static void main(String[] args) { 
     PasswordRandomizer password = new PasswordRandomizer(13); 
     System.out.println("Password: " + password.createPassword()); 
     System.out.println("Password: " + password.createPassword()); 
     System.out.println("Password: " + password.createPassword()); 
     System.out.println("Password: " + password.createPassword()); 
    } 
} 
+1

Вы должны добавить семя (https://docs.oracle.com/javase/7/docs/api/java/util/Random.html#setSeed(long)) – EGOrecords

ответ

1

после вызова метода createPassword() в первый раз, length 0. Дальнейшие вызовы не делать ничего и возвращает сгенерированный ранее password.

Сделайте password локальной переменной в методе createPassword() и используйте локальную переменную для обратного отсчета.

Обычно вы должны объявлять переменные как можно более локальными. Только объявляйте их на уровне объекта, если хотите поделиться значением между различными вызовами методов объекта.

public class PasswordRandomizer { 
    private Random random = new Random(); 
    private int length; 
    private String alphabet = "abcdefghijklmnopqrstuvwxyz"; 

    public PasswordRandomizer(int length) { 
     // Initialize the variable 
     this.length = length; 
    } 

    public String createPassword() { 
     int localLength = this.length; 
     String password = ""; 
     while (localLength > 0) {   
      int num = this.random.nextInt(26); 
      char character = alphabet.charAt(num); 
      password += character; 
      localLength--; 
     } 
     return password; 
    } 
} 
+2

Кроме того, 'alphabet' является константой, поэтому должен быть 'private static final String ALPHABET'. Конечно, просто выполнение символа char char = (char) ('a' + num) будет лучше. – Andreas

+0

Спасибо, NineBarry & Andreas (я также прочитал ваш ответ ниже). Теперь становится понятным, что это объяснено. Я также буду помнить об ASCII/Unicode, потому что я вижу, где это будет намного проще. – CogentCripple

1

Вам нужно сбросить password поле и инициализировать переменную length так, что createPassword() генерирует новый пароль при последующих вызовах. Например:

public String createPassword() { 
    password = ""; // Reset the password. 
    int length = this.length; // Initialize the password length. 
    while (length > 0) { 
     num = this.random.nextInt(26); 
     character = alphabet.charAt(num); 
     password += character; 
     length--; 
    } 
    return password; 
} 
1

Вы инициализируете пароль PasswordRandomizer = новый парольRandomizer (13); ' один раз. Так length = 13, length - переменная экземпляра, она достигает 0, после вызова метода createPassword, поэтому он возвращает тот же пароль в последующих вызовах функции createPassword. Обновите Program.java, как показано ниже.

public class Program { 
    public static void main(String[] args) { 
     PasswordRandomizer password = new PasswordRandomizer(13); 
     System.out.println("Password: " + password.createPassword()); 

     password = new PasswordRandomizer(13); 
     System.out.println("Password: " + password.createPassword()); 

     password = new PasswordRandomizer(13); 
     System.out.println("Password: " + password.createPassword()); 

     password = new PasswordRandomizer(13); 
     System.out.println("Password: " + password.createPassword()); 
    } 
} 

Или обновите свой createPassword(), как показано ниже.

public String createPassword() { 
     int length1 = length; 
     password =""; 
     while (length1 > 0) {   
      num = random.nextInt(26); 
      character = alphabet.charAt(num); 
      password += character; 
      length1--; 
     } 

     return password; 
    } 
1

Проблема заключается в том, что ваши поля сохранили значение от предыдущего вызова createPassword(), так что ничего не происходит на последующих вызовах.

Основная проблема заключается в том, что length - это номер 0 после первого вызова, и вы не сохранили исходное значение в любом месте, поэтому не знаете, каким он должен быть.


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

Только random и length должны быть полями, и их никогда не должно изменяться, поэтому сделайте их final.

Кроме того, чтобы преобразовать число 0-25 в письме a-z, вы можете рассчитывать на то, что эти письма являются последовательными в ASCII/Unicode, а просто написать 'a' + num, вместо того, чтобы делать строку поиска.

Поскольку вы знаете длину строки для создания, гораздо быстрее создать char[], заполнить символы, а затем создать String.

public class PasswordRandomizer { 
    private final Random random = new Random(); 
    private final int length; 

    public PasswordRandomizer(int length) { 
     this.length = length; 
    } 

    public String createPassword() { 
     char[] password = new char[this.length]; 
     for (int i = 0; i < this.length; i++) 
      password[i] = (char)('a' + this.random.nextInt(26)); 
     return new String(password); 
    } 
} 
Смежные вопросы