欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何生成定长的随机字符串

程序员文章站 2022-07-14 19:57:19
...

其实标题名字起得不是很恰当,主要最近在写代码的时候,需要生成一个全局范围内唯一的一个字符串,该字符串由两部分组成,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!

相关标签: 随机字符串