1. 程式人生 > >如何生成定長的隨機字串

如何生成定長的隨機字串

其實標題名字起得不是很恰當,主要最近在寫程式碼的時候,需要生成一個全域性範圍內唯一的一個字串,該字串由兩部分組成,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!