Java手写生成随机数

package com.gton.test;

import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Set;

/**
 * @description: 随机验证码
 * @author: GuoTong
 * @createTime: 2022-01-19 22:14
 * @since JDK 1.8 OR 11
 **/
public class YZM {

    //随机数工具类
    private SecureRandom secureRandom = new SecureRandom();
    //定义生成的字符属性规定{0,1,2=====0:大写字母,1:小写字母,2:数字}
    private char[] charIS = {0, 1, 2};
    //创建接收随机数的容器
    private StringBuilder builder = new StringBuilder();

    public static void main(String[] args) {
        System.out.println(new YZM().getCreateCode(5));

        System.out.println(new YZM().getCreateCodeL2(5));
    }

    /**
     * Description: 生成验证码,传入参数是验证码位数
     *
     * @author: GuoTong
     * @date: 2022-01-19 22:17:24
     */
    public String getCreateCode(int backSize) {
        return randomNumberFactory(false, backSize, null);
    }

    /**
     * Description: 生成验证码,传入参数是验证码位数
     * 必须保持既有字母又有数字,不能纯字母或者纯数字
     *
     * @author: GuoTong
     * @date: 2022-01-19 22:17:24
     */
    public String getCreateCodeL2(int backSize) {
        Set<Integer> container = new HashSet<>();
        String randomNumber = randomNumberFactory(true, backSize, container);
        if (container.size() == 3) {
            return randomNumber;
        } else {
            System.out.println("原始生成的数-" + randomNumber);
            randomNumber = handlerDifferentCombinations(backSize);
        }
        return randomNumber;

    }

    //判断是产生普通随机数还是类型多样保证随机数
    private String randomNumberFactory(boolean isNeedMoreType, int backSize, Set<Integer> contenitore) {
        for (int i = 0; i < backSize; i++) {
            //需要随机判断本次字符生成什么类型
            int charType = secureRandom.nextInt(charIS.length);
            //判断这个想要生成字符类型是什么
            switch (charType) {
                case 0:
                    createUppercaseLetter();
                    if (isNeedMoreType) {
                        contenitore.add(1);//标识已经取到一类型数据
                    }
                    break;
                case 1:
                    createLowerCaseLetters();
                    if (isNeedMoreType) {
                        contenitore.add(2);//标识已经取到一类型数据
                    }
                    break;
                case 2:
                    createNumber();
                    if (isNeedMoreType) {
                        contenitore.add(3);//标识已经取到一类型数据
                    }
                    break;
            }
        }
        return builder.toString();
    }


    //是否是不同的组合
    private String handlerDifferentCombinations(int backSize) {
        //重置不同的组合
        builder = new StringBuilder();
        //安排随机不同类型的数生成在什么位置,在不保证数的前面还是后面
        int isBefore = secureRandom.nextInt(2);
        switch (isBefore) {
            case 0:
                createL2NeedTypeNumber();
                //上面随机保证三种类型在前三位数参数,后几位就随机生成
                randomNumberFactory(false, backSize - 3, null);
                break;
            case 1:
                randomNumberFactory(false, backSize - 3, null);
                createL2NeedTypeNumber();
                break;
        }
        return builder.toString();
    }

    //大写字母ASCII:A-Z:65 - 91
    private void createUppercaseLetter() {
        char ch = (char) (secureRandom.nextInt(26) + 65);
        builder.append(ch);
    }

    //小写字母ASCII:a-z:97-97+25
    private void createLowerCaseLetters() {
        char ch2 = (char) (secureRandom.nextInt(26) + 97);
        builder.append(ch2);
    }

    //数字0-9
    private void createNumber() {
        builder.append(secureRandom.nextInt(10));
    }

    //生成不同类型的数字各一个
    private void createL2NeedTypeNumber() {
        //生成随机数
        int charType = secureRandom.nextInt(charIS.length);
        switch (charType) {
            case 0:
                createUppercaseLetter();
                createLowerCaseLetters();
                createNumber();
                break;
            case 1:
                createLowerCaseLetters();
                createUppercaseLetter();
                createNumber();
                break;
            case 2:
                createNumber();
                createLowerCaseLetters();
                createUppercaseLetter();
                break;
            default:
                break;
        }
    }
}

posted on 2022-01-20 22:09  白嫖老郭  阅读(162)  评论(0)    收藏  举报

导航