java产生随机验证码,有惑

import java.util.Arrays;
import java.util.Random;

public class VerificationCode {
    public static void main(String[] args) {
        String[] CHARS = { "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L",
                "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y" };
        boolean[] charFlags = new boolean[CHARS.length];
        String[] verifyCodes = new String[6];

        Random ran = new Random();
        for (int i = 0; i < verifyCodes.length; i++) {
            int index;
            do {
                index = ran.nextInt(CHARS.length);
            } while (charFlags[index]);
            verifyCodes[i] = CHARS[index];
            charFlags[index] = true;
        }
        //这段代码求解释   看不懂

        System.out.print("验证码为:");
        for (int i = 0; i < verifyCodes.length; i++) {
            System.out.print(verifyCodes[i]);
        }
    }
}

阅读 1.7k
2 个回答

具体是哪一行看不懂呢?
这个就是声明了一个验证码可取值数组CHARS
charFlags 的每个值对应了每个char是否已经用到过。(这里的目的是生成的验证码不会出现重复字符比如AA1234,两个A重复了)
verifyCodes是最终生成的验证码数组。
代码逻辑翻译过来就是:
每次从CHARS里面取一个字符,看这个字符是否已经用过,没有用过就放到最终的验证码数组verifyCodes中。然后取下一个,如果从CHARS中取出的字符已经用过,则再随机生成一个下标,重新取一个字符。直到取到6个不重复的字符为止。

搞双重循环是很低效的一个事, 如果验证码再长点, 某一位可能会长时间不出现, 不知作者为什么这么做? 为了更好的随机性? 原代码的核心是避免同一个字符重复出现

改成这样就会好理解:

import java.util.Arrays;
import java.util.Random;

public class VerificationCode {
    public static void main(String[] args) {
        char[] CHARS = { '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L',
                'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y' };
        char[] verifyCodes = new char[6];

        Random ran = new Random();
        for (int i = 0; i < verifyCodes.length; i++) {
            verifyCodes[i] = CHARS[ran.nextInt(CHARS.length)];
        }

        System.out.print("验证码为:");
        System.out.print(new String(verifyCodes));
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题