本帖最后由 dffzh 于 2025-9-17 16:40 编辑
@21小跑堂
之前有坛友问我怎么样可以让每个设备产生随机的不一样的MAC地址呢?其实C语言里面就有实现这种功能的库函数,我们来看看这两个库函数,然后再编写代码试试生成不同的MAC地址。 rand函数和srand函数是C语言中用于生成伪随机数的经典函数,定义在头文件<stdlib.h>中。它们的具体作用如下描述: srand: 设置随机数种子,种子决定了随机数序列的起点。 rand: 生成随机数,每次调用会返回一个伪随机整数,范围在 0 到 RAND_MAX (一个很大的常数,至少是 32767) 之间。 1、rand函数 rand函数的主要功能是生成一个伪随机整数,其返回值是一个介于0~RAND_MAX之间的整数,在stdlib.h文件中有对RAND_MAX的值进行定义: 那怎么样使用rand函数来生成我们需要的特定范围的随机数呢? 这个时候,你就可以使用取模运算(取模运算符为%)来实现。 比如需要的范围是[a,b],则就可以用下面这个通用的公式来实现: int data = a + rand() % (b-a+1); 我们举几个例子看看: 生成0~9的随机数: int data = 0 + rand() % (9-0+1); 即 int data = rand() % 10;
执行结果: 再举个例子,比如模拟骰子的数字1~6,生成1~6的随机数: int data = 1 + rand() % 6;
执行结果: 2、srand函数 srand函数的主要功能是为随机数生成器初始化种子,将一个无符号整型数 作为种子。 如果不使用srand函数,系统会默认给随机数生成器设置一个相同的初始状态(通常种子为1),这就意味着每次运行程序,rand函数产生的随机数序列其实都是一样不变的。 那怎么样让每次运行的序列都不一样呢? 我们需要给srand函数传入一个时刻变化的值,最常用的方法就是使用当前时间作为种子,用法如下: srand(time(0)); //用当前时间作为种子 int data = rand(); //再产生随机数 这里需要注意: 只需要在程序开始时调用一次srand函数即可,不要在循环里或者每次调用rand函数之前都调用它; 如果你在很短的间隔内(比如一秒内)多次运行用time(0)做种子的程序,由于time(0)的值还没变,它们可能会得到相同的随机序列。
使用以下代码运行3次的结果,每次结果都是一样的: 如果加入srand函数,再看运行3次的结果,每次结果都是不一样的:
从以上的测试对比就可以明显看出srand所起的作用。 接下来,我们编写代码看看怎么样生成随机的MAC地址。 大家知道,MAC地址一般是用十六进制表示的6字节编码标准,格式类似FF:FF:FF:FF:FF:FF。,即每个数据的范围是0~255,即相当于每次要生成6个0~255范围的十进制数据即可。 编写的示例代码如下: - #define MAC_ADDRESS_SIZE (6)
- unsigned char MAC[MAC_ADDRESS_SIZE] = {0,0,0,0,0,0};
- unsigned char i = 0;
- srand(time(0));
- for(i=0; i<MAC_ADDRESS_SIZE; i++)
- {
- MAC[i] = rand() % 255;
- }
- printf("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\r\n", MAC[0],MAC[1],MAC[2],MAC[3],MAC[4],MAC[5]);
仿真运行6次程序的测试结果如下所示,即可以产生随机不一样的MAC地址数据:
类似地,如果你需要生成随机不一样的IP地址和UID信息等,都可以用同样的方法来操作。
|