Java 为什么我的密码生成代码不能按预期工作?

Java 为什么我的密码生成代码不能按预期工作?,java,random,password-generator,Java,Random,Password Generator,我想每次都生成一个唯一的密码。我正在使用此代码生成密码 import java.util.Random; public class PasswordGenerator { public static String generatePassword() { Random r[] = new Random[8]; r[0] = new Random(1234567); r[1] = new Random(7654321);

我想每次都生成一个唯一的密码。我正在使用此代码生成密码

import java.util.Random;
public class PasswordGenerator
{
    public static String generatePassword()
    {
        Random r[] = new Random[8];
        r[0] = new Random(1234567);
        r[1] = new Random(7654321);
        r[2] = new Random(-1234567);
        r[3] = new Random(-7654321);
        r[4] = new Random(5463721);
        r[5] = new Random(2743615);
        r[6] = new Random(-9753214);
        r[7] = new Random(-3125769);
        Random x = new Random(2325671);
        StringBuilder password = new StringBuilder();
        int length = x.nextInt(5)+9;
        password.setLength(length);
        for(int i=0;i<length;i++)
        {
            x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
            password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
        }
        return password.toString();
    }
}
每次它生成相同的密码,即使我重新编译它。我应该修改什么来每次生成唯一的密码

最后工作代码

import java.util.Random;
public class PasswordGenerator
{
    public static String generatePassword()
    {
        Random r[] = new Random[8];
        for(int i=0;i<8;i++)
            r[i] = new Random();
        Random x = new Random();
        StringBuilder password = new StringBuilder();
        int length = x.nextInt(5)+9;
        password.setLength(length);
        for(int i=0;i<length;i++)
        {
            x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
            password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
        }
        return password.toString();
    }
}
import java.util.Random;
公共类密码生成器
{
公共静态字符串generatePassword()
{
随机r[]=新随机[8];
对于(int i=0;i
每次它都会生成相同的密码,即使在我重新编译它时也是如此。我应该修改什么来每次生成唯一的密码

您为9个随机变量实例中的每个实例显式提供了相同的种子:

Random r[] = new Random[8];
r[0] = new Random(1234567);
r[1] = new Random(7654321);
r[2] = new Random(-1234567);
r[3] = new Random(-7654321);
r[4] = new Random(5463721);
r[5] = new Random(2743615);
r[6] = new Random(-9753214);
r[7] = new Random(-3125769);
Random x = new Random(2325671);
不清楚为什么您甚至有多个
Random
实例,但您不应该指定相同的种子-这将保证每次都得到相同的结果。只需使用
Random
构造函数,它不接受种子,并且将根据当前时间选择种子(在现代版本中,如果您快速连续多次调用构造函数,可以使用一些jiggery扑克来避免使用相同的种子。)

看起来你在做各种各样的“聪明”混淆视听,试图使数据更随机-根据调用不同实例的
next
的结果设置一个种子,等等。您使代码更难理解,但不再是随机的。您仍然使用预先确定的种子,具有确定性的RNG。那里没有变化的来源


此外,对于敏感信息,应使用而不是
Random

这是因为您使用固定种子值实例化了随机实例:

r[0]=新随机数(1234567);

发件人:

如果使用相同的种子创建了两个Random实例,并且对每个实例进行了相同的方法调用序列,则它们将生成并返回相同的数字序列

那么:

r[0] = new Random(System.nanoTime());

时间值可能会为您提供一个良好的种子(=随机参数).

我建议您使用无参数随机构造函数来声明随机对象,因为采用参数的构造函数设置种子,从而使随机对象成为原子对象。我在下面为您编写了一个示例,通过将密码长度设置为六

import java.util.Random;
public class PasswordGenerator
{
    public static String generatePassword()
{
    Random r[] = new Random[8];
    r[0] = new Random();
    r[1] = new Random();
    r[2] = new Random();
    r[3] = new Random();
    r[4] = new Random();
    r[5] = new Random();
    r[6] = new Random();
    r[7] = new Random();
    Random x = new Random();
    StringBuilder password = new StringBuilder();
    int length = 6;
    password.setLength(length);
    for(int i=0;i<length;i++)
    {
        x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
        password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
    }
    return password.toString();
}

public static void main(String []args){

    System.out.println(PasswordGenerator.generatePassword());
}
}
import java.util.Random;
公共类密码生成器
{
公共静态字符串generatePassword()
{
随机r[]=新随机[8];
r[0]=新随机数();
r[1]=新随机数();
r[2]=新随机数();
r[3]=新随机数();
r[4]=新随机数();
r[5]=新随机数();
r[6]=新随机数();
r[7]=新随机数();
随机x=新随机();
StringBuilder密码=新建StringBuilder();
整数长度=6;
密码.setLength(长度);

对于(int i=0;看起来明白了。谢谢你们两位的帮助,现在它工作了。嗯……好的,我会记住的,再次感谢
import java.util.Random;
public class PasswordGenerator
{
    public static String generatePassword()
{
    Random r[] = new Random[8];
    r[0] = new Random();
    r[1] = new Random();
    r[2] = new Random();
    r[3] = new Random();
    r[4] = new Random();
    r[5] = new Random();
    r[6] = new Random();
    r[7] = new Random();
    Random x = new Random();
    StringBuilder password = new StringBuilder();
    int length = 6;
    password.setLength(length);
    for(int i=0;i<length;i++)
    {
        x.setSeed(r[i%8].nextInt(500)*r[4].nextInt(900));
        password.setCharAt(i,(char)(r[x.nextInt(256)%8].nextInt(95)+32));
    }
    return password.toString();
}

public static void main(String []args){

    System.out.println(PasswordGenerator.generatePassword());
}
}