随机字符串算法: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
原创粉丝点击