不在每个呼叫上生成随机字符

时间:2016-04-23 18:41:34

标签: java random

我希望有人可以指出我的方向,弄清楚为什么我的代码每次在主类中调用时都不会创建一个随机的字母字符串。

这是我的密码随机数发生器类:

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

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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;
}

答案 2 :(得分:1)

您正在初始化'PasswordRandomizer password = new PasswordRandomizer(13);'一旦。所以length = 13,length是实例变量,在调用createPassword方法后达到0,所以在后来的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;
    }

答案 3 :(得分:1)

问题是您的字段保留了之前调用createPassword()的值,因此后续调用没有任何反应。

主要问题是length在第一次通话后是0,并且您没有将原始值保存在任何地方,因此您不知道它应该是什么。

无论如何,不​​要为本地变量创建字段

只有randomlength必须是字段,并且永远不应更改它们,因此请将它们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);
    }
}