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   白嫖老郭  阅读(142)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示