STM32F103产生伪随机数

来源:互联网 发布:arcmap栅格数据矢量化 编辑:程序博客网 时间:2024/05/21 10:32
 最近做有线网关,需要在stm32f103这个平台生成一串随机数作为局域网身份认证token,stm32f103和f2,f4不同,没有随机数发生器,于是考虑用C的标准库结合定时器时间来实现.主要用到的两个函数是srand和rand.

srand和rand()配合使用产生伪随机数序列。
rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。

如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。

srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

通常可以
利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。


srand()函数:

头文件:#include<stdlib.h>

原型:void  srand(unsigned int seed);

rand()函数:

头文件:#include<time.h>

例子参见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';

}





另附:

有软件产生随机数的函数,可以去百度一下 基本原理是这样的: 先设置一个seed 通过一个复杂的运算,算出一个结果 输出结果并把结果当成新的seed再进行这个运算。 也就是说,产生的不是真正随机的数,但是由于输出,输入之间很复杂,可以认为是随