两个简单的随机数生成函数

static int GetRandASCIIVals(int nums,string& str_out_values)
{
int            i;
char           str;
struct timeval tv_time;

//CHECK_ERROR(nums <= 0, ERROR_DB_ACCESS_INPUT_PARAM);

//每次执行种子不同,生成不同的随机数
#if !(defined(_WIN32) || defined(_WIN64))
gettimeofday(&tv_time, NULL);
#else
time_t clock;
struct tm stm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
stm.tm_year = wtm.wYear - 1900;
stm.tm_mon = wtm.wMonth - 1;
stm.tm_mday = wtm.wDay;
stm.tm_hour = wtm.wHour;
stm.tm_min = wtm.wMinute;
stm.tm_sec = wtm.wSecond;
stm.tm_isdst= -1;
clock = mktime(&stm);
tv_time.tv_sec = clock;
tv_time.tv_usec = wtm.wMilliseconds * 1000;
#endif
srand(tv_time.tv_sec + tv_time.tv_usec * 1000000); 


str_out_values = "";
for (i = 0; i < nums; i++)
{
//产生区间[a,b]上的随机数
int check_num = (int)(rand() % (4 - 1 + 1)) + 1;


// A -> Z
if (check_num < 2)
{
str = (int)(rand() % (90 - 65 + 1)) + 65; 
}
// a -> z
else if(check_num < 3)
{
str = (int)(rand() % (122 - 97 + 1)) + 97;  
}
// 0 - > 9
else 
{
str = (int)(rand() % (57 - 48 + 1)) + 48; 
}


//在规定的范围内
if ((str >= 65 && str <= 90) \
|| (str >= 97 && str <= 122) \
|| (str >= 48 && str <= 57) )
{
str_out_values.push_back(str);
}
else
{
return SAM_FAILED;
}
}


return SAM_SUCCESS;
}


int GetRand(int nums,BYTE *ak)
{
HCRYPTPROV hCryptProv=NULL;
CryptAcquireContext((HCRYPTPROV*)&hCryptProv,NULL,NULL,PROV_RSA_FULL,0);

CryptGenRandom(hCryptProv,nums,ak);

for (int i = 0; i < nums; i++)
{
//转化为字母和数字
if(ak[i] >= 256)
{
ak[i] = ak[i]-256;
}

if(48<= ak[i] && 57 >=ak[i])
{
//直接使用
}
else if(65<= ak[i] && 90 >=ak[i])
{
//直接使用
}
else if(97<= ak[i] && 112 >=ak[i])
{
//直接使用
}
else
{
BYTE result=0;
CryptGenRandom(hCryptProv,1,&result);
int check_num =  result % 3;
// A - > Z
if (check_num == 0)
{
ak[i] = (int)(ak[i] / 10) + 65; 
}
// a -> z
else if(check_num == 1)
{
ak[i] = (int)(ak[i] / 10) + 97;  
}
// 0 - > 9
else if(check_num == 2)
{
ak[i] = (int)(ak[i] / 26) + 48; 
}
}
}

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值