随机字符串算法:13位随机字符串,两两不相同,至少1个大写字母,至少包含这5个字符之3“$@%*#”
来源:互联网 发布:win10添加ubuntu启动项 编辑:程序博客网 时间:2024/05/16 14:41
1、题目:
生成13位随机字符串,字符两两不相同,至少1个大写字母,至少包含这5个字符之3“$@%*#”
2、算法要点:
1)先选出3个特殊字符和1个大写字母,然后把剩余的是字符(10个数字26个小写25个大写2个特殊字符)作为下一步的选择空间
2)结果字符串一共有13个位置,随机选出4个位置,放置4个已经选出来的字符
3)从剩余字符里面,随机选出9个字符,放在剩余的9个空位里面
4)可以打表的尽量打表
3、性能:
机器: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 机器上,1秒时间可以生成200万个满足要求的字符串
环境: ubuntu13.04 g++4.6.1
4、代码:
//RandString.hclass RandString {public: static char* Generate(char* res); static bool Init();private: static const char LOWCASE_AND_NUM[37]; static const char SPECIAL_CHAR[10][6]; static const char UPPERCASE[26][26]; static bool init_; static int RandNum_(int max);};
#include "RandString.h"#include <string.h>#include <stdlib.h>#include <ctime>bool init_ = RandString::Init();const char RandString::LOWCASE_AND_NUM[37] = "abcdefghijklmnopqrstuvwxyz1234567890";const char RandString::SPECIAL_CHAR[10][6] = { "$@%*#", "$@*%#", "$@#%*", "$%*@#", "$%#@*", "$*#@%", "@%*#$", "@%#$*", "@*#$%", "%*#$@"};const char RandString::UPPERCASE[26][26] = { "BCDEFGHIJKLMNOPQRSTUVWXYZ", "ACDEFGHIJKLMNOPQRSTUVWXYZ", "ABDEFGHIJKLMNOPQRSTUVWXYZ", "ABCEFGHIJKLMNOPQRSTUVWXYZ", "ABCDFGHIJKLMNOPQRSTUVWXYZ", "ABCDEGHIJKLMNOPQRSTUVWXYZ", "ABCDEFHIJKLMNOPQRSTUVWXYZ", "ABCDEFGIJKLMNOPQRSTUVWXYZ", "ABCDEFGHJKLMNOPQRSTUVWXYZ", "ABCDEFGHIKLMNOPQRSTUVWXYZ", "ABCDEFGHIJLMNOPQRSTUVWXYZ", "ABCDEFGHIJKMNOPQRSTUVWXYZ", "ABCDEFGHIJKLNOPQRSTUVWXYZ", "ABCDEFGHIJKLMOPQRSTUVWXYZ", "ABCDEFGHIJKLMNPQRSTUVWXYZ", "ABCDEFGHIJKLMNOQRSTUVWXYZ", "ABCDEFGHIJKLMNOPRSTUVWXYZ", "ABCDEFGHIJKLMNOPQSTUVWXYZ", "ABCDEFGHIJKLMNOPQRTUVWXYZ", "ABCDEFGHIJKLMNOPQRSUVWXYZ", "ABCDEFGHIJKLMNOPQRSTVWXYZ", "ABCDEFGHIJKLMNOPQRSTUWXYZ", "ABCDEFGHIJKLMNOPQRSTUVXYZ", "ABCDEFGHIJKLMNOPQRSTUVWYZ", "ABCDEFGHIJKLMNOPQRSTUVWXZ", "ABCDEFGHIJKLMNOPQRSTUVWXY"};char* RandString::Generate(char* res) { memset(res, 0, 13*sizeof(char)); char first4char[4]; int spceialchar_idx = RandNum_(10); int uppercase_idx = RandNum_(26); memcpy(first4char, SPECIAL_CHAR[spceialchar_idx], 3); first4char[3] = uppercase_idx + 'A'; char last63char[63]; memcpy(last63char, LOWCASE_AND_NUM, 36); memcpy(last63char+36, UPPERCASE[uppercase_idx], 25); memcpy(last63char+61, SPECIAL_CHAR[spceialchar_idx]+3, 2); //在13个位置中,挑四个位置,放入已确定的4个字符(3个特殊字符+1个大写字母) char *cur = first4char, *end = first4char+4; while (cur != end) { int idx = RandNum_(13); while (res[idx] != '\0') idx = RandNum_(13); res[idx] = *(cur++); } //从剩余的63个字符(10个数字,26个小写,25个大写,2个特殊字符)中挑出9个,放在剩余的9个空位 bool hit63char[63]; memset(hit63char, 0, sizeof(hit63char)); cur = res; for (int i = 0; i < 9; ++i) { while (*cur != '\0') ++cur; int idx = RandNum_(63); while (hit63char[idx]) idx = RandNum_(63); hit63char[idx] = true; *cur++ = last63char[idx]; } return res;}bool RandString::Init() { srand((int)time(0)); return true;}int RandString::RandNum_(int max) { return rand() % max;}
#include "RandString.h"#include <iostream>int main() { char res[14]; res[13] = '\0';// std::cout << RandString::Generate(res) << std::endl; std::cout << RandString::Generate(res) << std::endl; for (int i = 0; i < 1000000; ++i) { RandString::Generate(res); RandString::Generate(res); }}
0 0
- 随机字符串算法:13位随机字符串,两两不相同,至少1个大写字母,至少包含这5个字符之3“$@%*#”
- 49个随机字符组成的字符串
- 求助:随机5个数中至少有3不相同的判断
- 求助:随机5个数中至少有3不相同的判断
- 产生10条包含10个字符以内的随机字符串,并排序
- Java生成随机字符串,必须包含数字、小写字母、大写字母
- C#随机产生10位大写字母的字符串
- js判断输入的字符串至少3个字母与3个数字组成
- 至少10位数,至少包含一个大写字母,至少一个小写字母,至少一个数字,(:;=*@)特殊字符中的一个正则表达式
- hdoj String 5672 (字符串模拟)求至少有k个不重复的字符的子串个数
- 随机生成20个字符串,然后排序
- ios随机生成4个字符串
- 随机产生n个字符串排序输出
- 从不断更新query日志的字符串流中随机选择一个字符串?10000个字符串呢?
- js正则密码验证密码至少包含大写字母,小写字母,数字,且不少于8位
- 得到随机字符串算法
- 面试题:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- java中对象的初始化与构造器
- 坐标和数字
- 原创
- The Suspects
- 【最长回文】HDU 4513 吉哥系列故事——完美队形II
- 随机字符串算法:13位随机字符串,两两不相同,至少1个大写字母,至少包含这5个字符之3“$@%*#”
- 软件测试模型综述
- 如何理解傅里叶变换
- 蛇形填洞
- 数位DP/数位统计 初探
- centos安装配置fastdfs (1)- 安装篇
- strcpy和strncpy区别
- 使用 Crash 工具分析 Linux dump 文件
- Altium designer 中使用3D 模式