Java 有人能给我解释一下这段代码吗?自动发电机

Java 有人能给我解释一下这段代码吗?自动发电机,java,random,passwords,temporary,Java,Random,Passwords,Temporary,我在网上找到这些代码: 但我并不确定代码的逻辑 public static String generateRandomPassword() { String letters = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789"; String pw = ""; for (int i=0; i<PASSWORD_LENGTH; i++) { int ind

我在网上找到这些代码:

但我并不确定代码的逻辑

public static String generateRandomPassword()
{

      String letters = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789";

      String pw = "";
      for (int i=0; i<PASSWORD_LENGTH; i++)
      {
          int index = (int)(RANDOM.nextDouble()*letters.length());
          pw += letters.substring(index, index+1); 
      }
      return pw;
}

谢谢D

此行将为您提供数组
字母
中“字母”的索引

int index=(int)(RANDOM.nextDouble()*letters.length())

因为它将返回一个“分数”(0.0d(包括)到1.0d(排除)),该分数乘以最后一个索引+1的大小,因此它将始终给出一个适当的索引

pw+=字母。子字符串(索引,索引+1)


将把索引中的字母添加到密码中。

将字母视为字符数组而不是字符串。这将帮助你理解

RANDOM.nextDouble()
将创建范围为0.0到1.0的随机双精度。然后将其乘以字符串(字符数组)的长度,得到一个介于0.0和数组最后一个索引之间的数字

(int)
将此数字转换为整数类型,这将切掉小数,留下一个整数。然后将该编号保存到索引中

pw += letters.substring(index, index+1);
在索引和其后的索引之间剪切一段字母字符串。本质上,它只是获取该索引处的字符,并将其添加到pw字符串中

然后,该函数返回pw字符串,这是一个随机生成的字符串,字母字符串中可能包含字符,长度为PASSWORD_length

int index=(int)(RANDOM.nextDouble()*letters.length())生成大于或等于0.0且小于1.0的随机双精度。然后将结果乘以可接受字母字符串的长度。基本上,在这两个步骤中,数字介于0(包括0)和有效“字母”总数之间,但它是双精度的,因此它有一个小数部分。该数字被转换为整数(一个整数),并保存到
索引
变量中

pw+=字母。子字符串(索引,索引+1)
pw
字母的子字符串连接起来。子字符串从上一行确定的索引开始,在
索引+1
处结束(不包括
索引+1
处的字符)。本质上,这部分在由上面生成的随机整数确定的索引处生成一个字符的子字符串。然后将其连接到现有的
pw
字符串上

步骤示例:

int index=(int)(RANDOM.nextDouble()*letters.length())

  • RANDOM.nextDouble()
    =>0.51
  • letters.length()
    =>60
  • RANDOM.nextDouble()*letters.length()
    =>30.6
  • (int)(RANDOM.nextDouble()*letters.length())
    =>30
  • pw+=字母。子字符串(索引,索引+1)

  • 字母。子字符串(索引,索引+1)
    =>“H”
  • pw+=字母。子字符串(索引,索引+1)
    =>“+”H=>“H”

  • 人们已经解释了代码。但我想指出的是,最初的代码效率非常低。您最好使用此代码(遵循相同的逻辑):

    static final char[]字母={'a','b',…,'7','8','9'};
    静态最终整型宽度=字母.length;
    公共静态字符串生成器域密码()
    {     
    char[]pw=新字符[密码长度];
    
    对于(int i=0;i代码的哪一部分让您感到困惑?选取一个随机字母(或数字),然后将其添加到
    +=
    行中的
    pw
    。什么让您困惑?您是否查看了
    RANDOM.nextDouble()
    可以返回哪些值?您知道
    字母的长度()
    mean?假设
    nextDouble
    只返回
    [0;1)
    RANDOM.nextDouble()*letters.length()
    ?如果我们将其转换为
    int
    ?您知道
    +=
    代表什么?或者
    子字符串
    的作用是什么?总之
    int index=(int)(RANDOM.nextDouble()*letters.length());
    应替换为
    int index=RANDOM.nextInt(letters.length());
    用于可读性,而
    String pw
    用于性能(
    pw.append(…)
    代替
    pw+=…
    )。非常感谢Michael,我现在明白了:D非常感谢!我现在明白了:D感谢你的详细解释:D感谢你分享一种更好的生成方法:D
    pw += letters.substring(index, index+1);
    
    static final char[] LETTERS = {'a', 'b', ..., '7', '8', '9'};
    static final int WIDTH = LETTERS.length;
    public static String generateRandomPassword()
    {     
      char[] pw = new char[PASSWORD_LENGTH];
      for (int i=0; i<PASSWORD_LENGTH; i++)
      {
          pw[i] = LETTERS[RANDOM.nextInt(WIDTH)];
      }
      return new String(pw);
    }