现在的位置: 首页 > 综合 > 正文

vc产生随机字符

2013年11月30日 ⁄ 综合 ⁄ 共 3504字 ⁄ 字号 评论关闭

*****************头文件************
////////////////////////随机字符///////////
//lib1.h
#include "stdafx.h"

#pragma once
//////////////////////////随机算法////////////
DWORD __stdcall DwRand();
//定义可选择的随机数组集合,如大小写字母、数字和标点符号
#define  RANDOMSTR_FLAG_LOWERCASE                 0x0001
#define  RANDOMSTR_FLAG_CAPITAL_LETTER            0x0002
#define  RANDOMSTR_FLAG_NUMBER                    0x0004
#define  RANDOMSTR_FLAG_PUNCTUATION               0x0008
#define  RANDOMSTR_FLAG_ALL                       0x000f

BOOL __stdcall GetRandomeStringW(__in WORD wRandstrFlag/*这个判断是否为大小写字母,数字或符号,可以组合使用*/,
         __out PWSTR lpbufStr/*接受的字符 */,
         __in DWORD buflen/* 字符长度*/);
*****************头文件************

*********************源文件***************************

*********************源文件***************************
#include "lib-1.h"
#include <vector>
//保存伪随机值
#pragma data_seg("f_Lib1_ShareSection")
BOOL g_Issand=FALSE;/*随机数的种子判断,这里用了全局变量保存,可能不算很好的算法!*/
#pragma data_seg()
/产生一个不大65536的值,作为种子
WORD __stdcall _inner_RandSeek(){
 if(g_Issand==FALSE){
  srand((unsigned)time(NULL));
   g_Issand=TRUE;
  }
 //srand只需调用一次,否则以后每次都会得到相同的结果
  return rand();
 }
// 随机产生一个不大于65536*65536的值
DWORD __stdcall DwRand(){
return (_inner_RandSeek()*_inner_RandSeek());
 }
//将可直接写到ASCII字符集保存到数组,注意数组的容量+1
const WCHAR lowercase[27]=L"abcdefghijklmnopurstuvwxyz";
const WCHAR capital_letter[27]={65,66,67,68,69,70,71,72,73,74,75,76,77,
                                78,79,80,81,82,83,84,85,86,87,88,89,90};
const WCHAR number[11]={48,49,50,51,52,53,54,55,56,57};
const WCHAR punctuation[32]={33,34,35,36,37,38,39,40,41,
                             42,43,44,45,46,47,58,59,60,61,62,63,64,91,
        92,93,94,95,96,123,124,125,126};

BOOL __stdcall  GetRandomeStringW(WORD wRandstrFlag/*这个判断是否为大小写字母,数字或符号,可以组合使用*/,
          PWSTR lpbufStr/*接受的字符 */,
         DWORD buflen/* 字符长度*/){
          using namespace std;
        
          if(lpbufStr==NULL) return (FALSE);
          PWSTR lpbuf= new WCHAR[buflen+1];
          vector<WORD> v;
          if(wRandstrFlag==(WORD)RANDOMSTR_FLAG_ALL
           ||wRandstrFlag==0
           /*注意,这里为0也同样于RANDOMSTR_FLAG_ALL */){
            v.push_back(1);//小写字母
            v.push_back(2);//大写字母
            v.push_back(3);//数字
            v.push_back(4);//符号
           }
          else
         {
           if((wRandstrFlag&RANDOMSTR_FLAG_LOWERCASE)
            ==RANDOMSTR_FLAG_LOWERCASE)
            v.push_back(1);//小写字母 1
          if((wRandstrFlag&RANDOMSTR_FLAG_CAPITAL_LETTER)
           ==RANDOMSTR_FLAG_CAPITAL_LETTER)
           v.push_back(2);//大写字母 2
          if((wRandstrFlag&RANDOMSTR_FLAG_NUMBER)
           ==RANDOMSTR_FLAG_NUMBER)
           v.push_back(3);//数字 4
          if((wRandstrFlag&RANDOMSTR_FLAG_PUNCTUATION)
           ==RANDOMSTR_FLAG_PUNCTUATION)
           v.push_back(4);//符号 8
           }
          /*上面的代码很脆弱,如果0123的次序被打乱,下面的代码将不能准确执行 */
          if(0==v.size()) return(FALSE);//判断
   /*如果字符长度小于6或大于128,则等于6或128*/
   if(buflen<6) buflen=6;
   if(buflen>128) buflen=128;
   WORD lastIndex=v.size();//根据的是上面依次push_back的最后的索引位置,从小到大。
   int flagword=-1;//用于储存被随机选中的wRandstrFlag值
   int index=-1;//在数组中索引值
   for(int i=0;i<(int)buflen;i++){
//计算选择FLAG
flagword=(DwRand()+256)%lastIndex;

flagword=v[flagword]-1;
switch(flagword){
case 0:/*小写字母 */
 index=(DwRand()+256)%26;/*+256表示最小的值为256 */
//PA(index);
lpbuf[i]=lowercase[index];
break;
case 1:/*大写字母 */
index=(DwRand()+256)%26;
lpbuf[i]=capital_letter[index];
break;
case 2:/* 数字*/
 index=(DwRand()+256)%10;
 lpbuf[i]=number[index];
break;
case 3:/*符号 */
 index=(DwRand()+256)%31;
 lpbuf[i]=punctuation[index];
 break;
 }//switch

 }//for
//如果lpbuf溢出
   lpbuf[buflen]=0;
  
   lstrcpyW(lpbufStr,lpbuf);
   v.clear();
   delete[] lpbuf;
   return (TRUE);
 }

 

抱歉!评论已关闭.