Java 按指定概率生成由字母、数字、特殊符号组成的密码
package com.demo.uitls;import java.util.Random;/*** 按一定的概率生成一个随机的N位(N>=3)密码,必须由字母数字特殊符号组成,三者缺一不可* <ul>* <li>数字: 0-9</li>* <li>字母: A-Za-z</li>* <li>特殊符号: `~!@#$%^&*()-_=+[]{}\|;:'",<.>/?</li>* </ul>*/
public class GenerateRandomPassword {private static final byte INDEX_NUMBER = 0;private static final byte INDEX_LETTER = 1;private static final byte INDEX_SPECIAL_CHAR = 2;/** 特殊符号 */private static final char[] SPECIAL_CHARS = { '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', ']', '{', '}', '\\', '|', ';', ':', '\'', '"', ',', '<', '.', '>', '/', '?' };/*** 按一定的概率生成一个随机的N位(N>=3)密码,必须由字母数字特殊符号组成,三者缺一不可* * @param len* 密码长度,必须大于等于3* @param genChances* 分别是生成数字、字母、特殊符号的概率* @return 生成的随机密码*/private static char[] generateRandomPassword(final int len, final byte[] paramGenChances) throws IllegalArgumentException {if (len < 3) {throw new IllegalArgumentException("len must not smaller than 3, but now is " + len);}final char[] password = new char[len];// 之所以该复制一份是为了使函数不对外产生影响final byte[] genChances = paramGenChances.clone();final byte[] genNums = new byte[genChances.length];for (byte i = 0; i < genChances.length; i++) {genNums[i] = 0;}final Random random = new Random();int r;for (int i = 0; i < len; i++) {adjustGenChance(len, i, genChances, genNums);byte index = getPasswordCharType(random, genChances);genNums[index]++;switch (index) {case INDEX_NUMBER:password[i] = (char) ('0' + random.nextInt(10));break;case INDEX_LETTER:r = random.nextInt(52);if (r < 26) {password[i] = (char) ('A' + r);} else {password[i] = (char) ('a' + r - 26);}break;case INDEX_SPECIAL_CHAR:r = random.nextInt(SPECIAL_CHARS.length);password[i] = SPECIAL_CHARS[r];break;default:password[i] = ' ';break;}}logChances(genNums);return password;}/*** 根据当前需要生成密码字符的位置,动态调整生成概率* * @param len* 待生成的总长度* @param index* 当前位置* @param genChances* 分别是生成数字、字母、特殊符号的概率* @param genNums* 这些类型已经生成过的次数*/private static void adjustGenChance(final int len, final int index, final byte[] genChances, final byte[] genNums) {final int leftCount = len - index;byte notGenCount = 0;for (byte i = 0; i < genChances.length; i++) {if (genNums[i] == 0) {notGenCount++;}}if (notGenCount > 0 && leftCount < genChances.length && leftCount == notGenCount) {for (byte i = 0; i < genChances.length; i++) {if (genNums[i] > 0) {genChances[i] = 0;}}}}/*** 获取该密码字符的类型* * @param random* 随机数生成器* @param genChances* 分别是生成数字、字母、特殊符号的概率* @return 密码字符的类型*/private static byte getPasswordCharType(final Random random, final byte[] genChances) {int total = 0;byte i = 0;for (; i < genChances.length; i++) {total += genChances[i];}int r = random.nextInt(total);for (i = 0; i < genChances.length; r -= genChances[i], i++) {if (r < genChances[i]) {break;}}return i;}public static void main(String[] args) {test1();test2();}/*** 打印生成密码中各类字符的个数*/private static void logChances(byte[] genNums) {StringBuilder sb = new StringBuilder();sb.append("{");for (byte i = 0; i < genNums.length; i++) {sb.append(genNums[i]);if (i != genNums.length - 1) {sb.append(", ");}}sb.append("}");System.out.println(sb.toString());}private static void test1() {byte[] genChances = { 1, 1, 1 };for (int i = 3; i < 200; i += 30) {try {char[] password = generateRandomPassword(i, genChances);System.out.println(password);} catch (IllegalArgumentException e) {e.printStackTrace();}}System.out.println();}private static void test2() {byte[] genChances = { 2, 5, 3 };for (int i = 3; i < 200; i += 30) {try {char[] password = generateRandomPassword(i, genChances);System.out.println(password);} catch (IllegalArgumentException e) {e.printStackTrace();}}System.out.println();}
}
输出结果
Java 按指定概率生成由字母、数字、特殊符号组成的密码相关推荐
- java实现:随机生成小写字母,并判断是元音还是辅音
java实现: 随机生成小写字母,并判断是元音还是辅音 用switch进行判断,然后把switch放入for循环 package com.word.word;//随机生成小写字母,并判断是元音还是辅音 ...
- html获取随机字母,html5 canvas随机生成英文字母数字组合图片验证码代码
简单又实用的html5 canvas随机生成英文字母数字组合图片验证码代码,点击验证码图片可更换一组,还可随意修改验证码的内容,样式. 查看演示 下载资源: 27 次 下载资源 下载积分: 20 积分 ...
- 随机生成邀请码、随机生成10位数字、随机生成英文字母+数字
/*** 随机字符串生成* @param int $length 生成字符串长度* @param array $str_content ['number','capital_chars','lower ...
- Java:实现 按概率生成随机数算法(附完整源码)
Java:实现 按概率生成随机数算法 /*** 从一组数据按照概率分布随机取出一个*/public static int getRandomNum(List<ModelNum> nums) ...
- python随机生成大写字母_python随机生成大小写字母数字混合密码(仅20行代码)
用简单的方法生成随机性较大的密码 仅用20行代码随机生成密码 核心思路:利用random模块 random模块随机生成数字,大小写字母,循环次数 while循环+随机生成的循环次数-->随机pl ...
- python笔记2:指定概率生成数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python笔记2:指定概率生成数据 一.random指定范围随机生成数 1. *random.choice()在指定数据集内生成随机 ...
- html 随机字母,JS简单生成由字母数字组合随机字符串示例
本文实例讲述了JS简单生成由字母数字组合随机字符串.分享给大家供大家参考,具体如下: 前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇 ...
- Java正则校验密码至少包含:字母数字特殊符号中的2种
一.语法 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如, n匹配字符 n.\n 匹配换行符.序列 \\\\ 匹配 \\ ,\\( 匹配 (. ^ 匹配输入字符串开始的位 ...
- Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行
Windows下Java+Tesseract-OCR对图像进行字符识别,亲测可行 1. 下载tesseract-ocr.中文语言包并安装 2. 命令行对图片进行识别及效果图 3. Java调用Tess ...
最新文章
- python可以干什么-Python可以用来做什么 为你揭开python神秘面纱
- ubutnu16.04搭建LAMP环境(搭建wordpress博客)
- 阿里云redis设置缓存方法
- 听着三只松鼠上市的钟声,罗永浩流下了悔恨的泪水
- java死信队列_Spring Boot系列教程之死信队列详解
- IBM 发布企业级社交协作平台 Domino V10,开启快速应用程序开发的新时代
- 导出一条数据_来自小师弟的灵魂拷问之数据泵导出丢失的那些数据量去哪了?...
- php 图片上传 文件上传 大小 限制
- 为什么读大学时做学术比搞项目重要?
- 《机器学习实战》中英文电子书 + 源代码下载
- Windows安装最新版Pygame
- 前端开发实战:实现京东购物平台的静态首页
- 手把手教你给KEGG pathway图标注颜色
- requirejs的源码学习(01)——初始化流程
- 桌面图标黑色解决方案
- 计算机二级模拟考试软件
- linux\uinux
- springCloud微服务常用设计模式(聚合方式)
- 智慧消防三维预案辅助决策系统
- 用JS实现:图片压缩、图片加密