如何生成定長的隨機字串
阿新 • • 發佈:2018-11-23
其實標題名字起得不是很恰當,主要最近在寫程式碼的時候,需要生成一個全域性範圍內唯一的一個字串,該字串由兩部分組成,2位的索引+15位的使用者標識。例如這樣的08460980000000001。
如果使用者標識不存在的時候,需要採用15位的隨機字串代替。針對隨機生成字串的部分,簡單寫了(抄了)一段程式碼,
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "time.h"
typedef unsigned char U8;
/* 隨機定長length的字串 */
// 這裡只給了buff指標,請在呼叫處申請好記憶體,
// 請勿傳入空指標,要確保buff size 大於 length
static coid genRandomString(char *buff, U8 length)
{
U8 metachar[] = "0123456789";
U8 index = 0;
srand((U8)time(NULL)); // 時間為種子
for(index = 0; index < length; index++)
{
buff[index] = metachar[rand() % 10];
}
buff[length] = '\0';
}
/* 專案中的調用出比較複雜,簡單寫一個主函式呼叫一下吧 */
int main()
{
U8 imsiStr[16] = {'\0'};
U8 pfIndex = 8;
U8 outString[18] = {'\0'};
outString[0] = (pfIndex / 10) + '0';
outString[1] = (pfIndex % 10) + '0';
genRandomString(imsiStr, 15);
memcpy(&outString[2], imsiStr, 15);
printf("outString = %s, strlen = %d\n" , outString, strlen(outString));
return 0;
}
哇哇哇,寫好了,很開心對不對,編譯執行一下吧,不錯,生成了一個值:
outString = 08120035406835352, strlen = 17
貌似很符合要求呀,那我們修改一下程式碼,
int main()
{
U8 imsiStr[16] = {'\0'};
U8 pfIndex = 8;
U8 outString[18] = {'\0'};
U8 loop = 20;
outString[0] = (pfIndex / 10) + '0';
outString[1] = (pfIndex % 10) + '0';
while(loop)
{
genRandomString(imsiStr, 15);
memcpy(&outString[2], imsiStr, 15);
printf("outString = %s, strlen = %d\n", outString, strlen(outString));
loop --;
}
return 0;
}
猜猜,會不會生成完全不同的20組字串,執行一下吧
outString = 08297494622012913, strlen = 17
outString = 08297494622012913, strlen = 17
outString = 08297494622012913, strlen = 17
…
outString = 08297494622012913, strlen = 17
這是怎麼回事。
我們分析一下程式碼,發現每次執行時,都執行了srand((U8)time(NULL));
因為此程式產生一個隨機數之前,都呼叫一次srand,而由於計算機執行很快,所以每用time得到的時間都是一樣 的(time 的時間精度較低,只有55ms)。這樣相當於使用同一個種子產生隨機序列,所以產生的隨機數總是相同的。
我們把seed放在外層就可以,試試吧!
static coid genRandomString(char *buff, U8 length)
{
U8 metachar[] = "0123456789";
U8 index = 0;
// srand((U8)time(NULL)); // 時間為種子
for(index = 0; index < length; index++)
{
buff[index] = metachar[rand() % 10];
}
buff[length] = '\0';
}
int main()
{
U8 imsiStr[16] = {'\0'};
U8 pfIndex = 8;
U8 outString[18] = {'\0'};
U8 loop = 20;
outString[0] = (pfIndex / 10) + '0';
outString[1] = (pfIndex % 10) + '0';
srand((U8)time(NULL)); // 時間為種子
while(loop)
{
genRandomString(imsiStr, 15);
memcpy(&outString[2], imsiStr, 15);
printf("outString = %s, strlen = %d\n", outString, strlen(outString));
loop --;
}
return 0;
}
enjoy it!