最近做有线网关,需要在stm32f103这个平台生成一串随机数作为局域网身份认证token,stm32f103和f2,f4不同,没有随机数发生器,于是考虑用C的标准库结合定时器时间来实现.主要用到的两个函数是srand和rand.
srand和rand()配合使用产生伪随机数序列。
rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。
如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。
srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。
通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。
srand()函数:
头文件:#include
原型:void srand(unsigned int seed);
rand()函数:
头文件:#include
例子参见srand()函数百度百科。
其实实现还是挺简单的,在你的文件里面包含两个头文件,直接调用以上的函数就行,至于需要修改的seed,目前采用的方法主要两种,一种是采用定时器时间seed,一种是采用读取某个悬空引脚adc的数值作为seed.
举例:
时间作为seed的方法。
void genRandomString(int length,char*string)
{
int flag, i;
srand(time_clock); //将time_clock改成某个悬空adc值adcvalue也行
for (i = 0; i < length - 1; i++)
{
flag = rand()%3;
switch (flag)
{
case 0:
string = 'A' + rand() % 26;
break;
case 1:
string = 'a' + rand() % 26;
break;
case 2:
string = '0' + rand() % 10;
break;
default:
string = 'x';
break;
}
}
string[length - 1] = '\0';
}