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 按指定概率生成由字母、数字、特殊符号组成的密码相关推荐

  1. java实现:随机生成小写字母,并判断是元音还是辅音

    java实现: 随机生成小写字母,并判断是元音还是辅音 用switch进行判断,然后把switch放入for循环 package com.word.word;//随机生成小写字母,并判断是元音还是辅音 ...

  2. html获取随机字母,html5 canvas随机生成英文字母数字组合图片验证码代码

    简单又实用的html5 canvas随机生成英文字母数字组合图片验证码代码,点击验证码图片可更换一组,还可随意修改验证码的内容,样式. 查看演示 下载资源: 27 次 下载资源 下载积分: 20 积分 ...

  3. 随机生成邀请码、随机生成10位数字、随机生成英文字母+数字

    /*** 随机字符串生成* @param int $length 生成字符串长度* @param array $str_content ['number','capital_chars','lower ...

  4. Java:实现 按概率生成随机数算法(附完整源码)

    Java:实现 按概率生成随机数算法 /*** 从一组数据按照概率分布随机取出一个*/public static int getRandomNum(List<ModelNum> nums) ...

  5. python随机生成大写字母_python随机生成大小写字母数字混合密码(仅20行代码)

    用简单的方法生成随机性较大的密码 仅用20行代码随机生成密码 核心思路:利用random模块 random模块随机生成数字,大小写字母,循环次数 while循环+随机生成的循环次数-->随机pl ...

  6. python笔记2:指定概率生成数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python笔记2:指定概率生成数据 一.random指定范围随机生成数 1. *random.choice()在指定数据集内生成随机 ...

  7. html 随机字母,JS简单生成由字母数字组合随机字符串示例

    本文实例讲述了JS简单生成由字母数字组合随机字符串.分享给大家供大家参考,具体如下: 前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇 ...

  8. Java正则校验密码至少包含:字母数字特殊符号中的2种

    一.语法 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如, n匹配字符 n.\n 匹配换行符.序列 \\\\ 匹配 \\ ,\\( 匹配 (. ^ 匹配输入字符串开始的位 ...

  9. Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行

    Windows下Java+Tesseract-OCR对图像进行字符识别,亲测可行 1. 下载tesseract-ocr.中文语言包并安装 2. 命令行对图片进行识别及效果图 3. Java调用Tess ...

最新文章

  1. python可以干什么-Python可以用来做什么 为你揭开python神秘面纱
  2. ubutnu16.04搭建LAMP环境(搭建wordpress博客)
  3. 阿里云redis设置缓存方法
  4. 听着三只松鼠上市的钟声,罗永浩流下了悔恨的泪水
  5. java死信队列_Spring Boot系列教程之死信队列详解
  6. IBM 发布企业级社交协作平台 Domino V10,开启快速应用程序开发的新时代
  7. 导出一条数据_来自小师弟的灵魂拷问之数据泵导出丢失的那些数据量去哪了?...
  8. php 图片上传 文件上传 大小 限制
  9. 为什么读大学时做学术比搞项目重要?
  10. 《机器学习实战》中英文电子书 + 源代码下载
  11. Windows安装最新版Pygame
  12. 前端开发实战:实现京东购物平台的静态首页
  13. 手把手教你给KEGG pathway图标注颜色
  14. requirejs的源码学习(01)——初始化流程
  15. 桌面图标黑色解决方案
  16. 计算机二级模拟考试软件
  17. linux\uinux
  18. springCloud微服务常用设计模式(聚合方式)
  19. 智慧消防三维预案辅助决策系统
  20. 用JS实现:图片压缩、图片加密

热门文章

  1. 安装JAVA SE/jdk后,未发现jdk/lib的tools.jar和dt.jar文件
  2. 微服务应用大行其道,我提供一个dto和entity转换工具类,方便大家做转换,少写机械代码,多陪陪家人...
  3. 知识:遥远的月球,怎么会引起地球上得潮汐呢
  4. 如何自学软件测试呢?软件测试工程师的职位要求
  5. C语言实现PING功能
  6. 微信小程序长按与单击事件触发
  7. 故障插入测试技术研究
  8. 修正篇:视频flv格式转mp4
  9. 使用拉易网制作图文并茂的精美HTML邮件模板(终)
  10. Java中valueOf()方法