Rover12421's Blog

The End.

对生成随机字符串函数的修改

很早以前写过一篇关于《生成随机字符串》的文章。最近写项目的时候用到了,不过做了小小的调整,也加了注释。最大的调整的是随机因子的产生上,以前用的是时间秒级的time函数,现在改成了时间毫秒级的GetTickCount函数了。

 

头文件:RandomString.h

   1: #pragma once
   2:  
   3: #define RdAllType           0x07    //大小写和数字
   4: #define RdNum               0x01    //数字
   5: #define RdLowercase         0x02    //小写
   6: #define RdUppercase         0x04    //大写
   7: static TCHAR szAllChar[] = _T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
   8:  
   9: bool fn_RandomString( const int nLeng, TCHAR *szRandStringInput, const int nType );

源文件:

   1: #include "stdafx.h"        //如果使用了stdafx.h需要包含此头文件
   2: #include "RandomString.h"
   3: #include <stdlib.h>
   4: //#include <WinBase.h>    //Sleep所需头文件
   5: #include <Windows.h>    //WinBase.h 包含出错可以包含Windows.h
   6:  
   7: //生成随机字符串
   8: //参数:
   9: //nLeng:生成的随机字符串长度(IN)
  10: //szRandStringInput:输出的随机字符串(OUT)
  11: //nType:生成的随机字符串字符类型,可以是一下类型的一种或多种的并集(IN)
  12: //RdAllType           0x07    //大小写和数字
  13: //RdNum               0x01    //数字
  14: //RdLowercase         0x02    //小写
  15: //RdUppercase         0x04    //大写
  16: bool fn_RandomString( const int nLeng, TCHAR *szRandStringInput, const int nType )
  17: {
  18:     if (0 == nLeng)
  19:     {
  20:         if (0 == _tcslen(szRandStringInput))
  21:         {
  22:             return true;
  23:         } 
  24:         else
  25:         {
  26:             return false;
  27:         }
  28:     }
  29:     if (nLeng < 0)
  30:     {
  31:         return false;
  32:     }
  33:  
  34:     Sleep(20);    //防止用GetTickCount在系统的时间还没有更新又再次调用,避免随机性的重复,休眠时间可以更具不同的机器调整
  35:     srand(GetTickCount());
  36:     bool bRet = false;
  37:     int nMin = 0;
  38:     int nMax = 62;
  39:     switch(nType & RdAllType)
  40:     {
  41:     case RdAllType:
  42:         break;
  43:     case RdNum:
  44:         nMin = 52;
  45:         break;
  46:     case RdNum | RdLowercase:
  47:         nMin = 26;
  48:         break;
  49:     case RdNum | RdUppercase:
  50:         nMin = 26;
  51:         break;
  52:     case RdUppercase:
  53:         nMax = 25;
  54:         break;
  55:     case RdUppercase | RdLowercase:
  56:         nMax = 51;
  57:         break;
  58:     case RdLowercase:
  59:         nMin = 26;
  60:         nMax = 51;
  61:         break;
  62:     default:
  63:         return false;
  64:         break;
  65:     }
  66:  
  67:     int nRange = nMax - nMin;
  68:     if (nType == (RdNum | RdUppercase))
  69:     {
  70:         int nNum = 0;
  71:         for (int t = 0; t <= nLeng; t++)
  72:         {            
  73:             nNum = nMin + rand()%nRange;
  74:             if (nNum < 52)
  75:             {
  76:                 nNum -= 26;
  77:             }
  78:             szRandStringInput[t] = szAllChar[nNum];
  79:         }
  80:     }
  81:     else
  82:     {
  83:         for (int t = 0; t <= nLeng; t++)
  84:         {            
  85:             szRandStringInput[t] = szAllChar[nMin + rand()%nRange];
  86:         }
  87:     }
  88:     return true;
  89: }

也可以使用这个生成随机字符串来生成随机时间。下面是我写的一个随机时间函数:

   1: //生成指定范围内的随机时间(ms)
   2: //参数:
   3: //dwStartTime:开始的ms时间
   4: //dwEndTime:结束的ms时间
   5: //nMaxLen:最大时间的长度
   6: DWORD fn_RandomTime( const DWORD dwStartTime, const DWORD dwEndTime, int nMaxLen )
   7: {
   8:     TCHAR szTime[25];
   9:     ZeroMemory(szTime, sizeof(szTime));
  10:     fn_RandomString(nMaxLen, szTime, RdNum);
  11:     DWORD dwTime = _tstol(szTime);
  12:     dwTime = dwStartTime + dwTime%(dwEndTime - dwStartTime);
  13:     return dwTime;
  14: }

 

最新写代码,发现自己也在慢慢的变化,或许是好事吧。

Comments