java:随机生成符合要求的复杂密码

前言:

密码要求:
必须要包含大写字符、小写字符、数字、特殊符号,密码长度在 8-20 位。

设计结果:
输入密码长度,返回符合要求的随机密码。

1.需求拆分

需求可分为两点:

  1. 四种字符必须包含
  2. 长度 8-20 位
2.逻辑设计
  1. 声明一个 list
  2. 把 4 种字符每种随机选一个放进 list
  3. 根据密码长度要求再随机选择4种字符放进list
  4. list 重新排序
  5. list 遍历组合成字符串输出
3.代码设计
  1. 首先写 4 个函数用于生成 4 种字符
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 要求:密码需要有大写、小写、特殊字符、长度在 8-20 位
 */

public class RandomPwd {
    private static final String lowStr = "abcdefghijklmnopqrstuvwxyz";
    private static final String specialStr = "~!@#$%^&*()_+/-=[]{};:'<>?.";
    private static final String numStr = "0123456789";

	// 随机获取字符串字符
    private static char getRandomChar(String str) {
        SecureRandom random = new SecureRandom();
        return str.charAt(random.nextInt(str.length()));
    }
	// 随机获取小写字符
    private static char getLowChar() {
        return getRandomChar(lowStr);
    }

	// 随机获取大写字符
    private static char getUpperChar() {
        return Character.toUpperCase(getLowChar());
    }

	// 随机获取数字字符
    private static char getNumChar() {
        return getRandomChar(numStr);
    }

	// 随机获取特殊字符
    private static char getSpecialChar() {
        return getRandomChar(specialStr);
    }
}

tip:
建议使用 SecureRandom 而不是 Random,Random 靠传入的种子计算,SecureRandom 靠随机事件进行计算,具有更好的随机性。

  1. 其次写一个函数用于指定调用 4 个函数的哪一个
    private static char getRandomChar(int funNum) {
        switch (funNum) {
            case 0:
                return getLowChar();
            case 1:
                return getUpperChar();
            case 2:
                return getNumChar();
            default:
                return getSpecialChar();
        }
    }
  1. 最后写一个函数用于组合上面函数功能,用于随机生成密码
    private static String getRandomPwd(int num) {
        if (num > 20 || num < 8) {
            System.out.println("长度不满足要求");
            return "";
        }
		// 先把 4 种字符每种来一个放进 list
        List<Character> list = new ArrayList<>(num);
        list.add(getLowChar());
        list.add(getUpperChar());
        list.add(getNumChar());
        list.add(getSpecialChar());

		// 因为已经把 4 种字符放进list了,所以 i 取值从 4开始
		// 产生随机数用于随机调用生成字符的函数
        for (int i = 4; i < num; i++) {
            SecureRandom random = new SecureRandom();
            int funNum = random.nextInt(4);
            list.add(getRandomChar(funNum));
        }
        
        Collections.shuffle(list);   // 打乱排序
        StringBuilder stringBuilder = new StringBuilder(list.size());
        for (Character c : list) {
            stringBuilder.append(c);
        }

        return stringBuilder.toString();
    }
4.全量代码和测试
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 要求:密码需要有大写、小写、特殊字符、长度在 8-20 位
 */

public class RandomPwd {

    private static final String lowStr = "abcdefghijklmnopqrstuvwxyz";
    private static final String specialStr = "~!@#$%^&*()_+/-=[]{};:'<>?.";
    private static final String numStr = "0123456789";

    // 随机获取字符串字符
    private static char getRandomChar(String str) {
        SecureRandom random = new SecureRandom();
        return str.charAt(random.nextInt(str.length()));
    }

    // 随机获取小写字符
    private static char getLowChar() {
        return getRandomChar(lowStr);
    }

    // 随机获取大写字符
    private static char getUpperChar() {
        return Character.toUpperCase(getLowChar());
    }

    // 随机获取数字字符
    private static char getNumChar() {
        return getRandomChar(numStr);
    }

    // 随机获取特殊字符
    private static char getSpecialChar() {
        return getRandomChar(specialStr);
    }

    //指定调用字符函数
    private static char getRandomChar(int funNum) {
        switch (funNum) {
            case 0:
                return getLowChar();
            case 1:
                return getUpperChar();
            case 2:
                return getNumChar();
            default:
                return getSpecialChar();
        }
    }

    // 指定长度,随机生成复杂密码
    private static String getRandomPwd(int num) {
        if (num > 20 || num < 8) {
            System.out.println("长度不满足要求");
            return "";
        }
        List<Character> list = new ArrayList<>(num);
        list.add(getLowChar());
        list.add(getUpperChar());
        list.add(getNumChar());
        list.add(getSpecialChar());

        for (int i = 4; i < num; i++) {
            SecureRandom random = new SecureRandom();
            int funNum = random.nextInt(4);
            list.add(getRandomChar(funNum));
        }

        Collections.shuffle(list);   // 打乱排序
        StringBuilder stringBuilder = new StringBuilder(list.size());
        for (Character c : list) {
            stringBuilder.append(c);
        }

        return stringBuilder.toString();
    }

    // 测试函数入口
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            int num = 10;
            System.out.println(getRandomPwd(num));
        }
    }

}

测试输出:

.s@K+T935N
9&5pvXl4D0
uZ1q'>42:N
17.q_Y]z{Z
!620oGTfM&
6O}8ugCfT)
#d2KS4<FDW
d3S5*9;P@_
]IM@2cG9+l
_5@0ci$dRP

这个密码几乎没有规律性。

混矩阵是一种用于评估分类模型性能的工具,它用于描述分类任务中的真阳性(TP),假阳性(FP),假阴性(FN)和真阴性(TN)的情况。 在Python中,可以使用以下代码来计算混淆矩阵的四个元素:TP、FP、TN、FN。 ```python # 输入TP,TN,FP,FN TP = int(input("请输入TP:")) TN = int(input("请输入TN:")) FP = int(input("请输入FP:")) FN = int(input("请输入FN:")) # 输出混淆矩阵 confusion_matrix = [[TP, FP], [FN, TN]] print("混淆矩阵:", confusion_matrix) ``` 其中,TP表示真阳性,即被正确地划分为正例的样本数;FP表示假阳性,即被错误地划分为正例的样本数;FN表示假阴性,即被错误地划分为负例的样本数;TN表示真阴性,即被正确地划分为负例的样本数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [输入TP,TN,FP和FN,然后输出混淆矩阵和评价指标的Python代码](https://download.csdn.net/download/weixin_46163097/87666583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率](https://blog.csdn.net/wsLJQian/article/details/131001328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值