news 2026/8/21 17:43:41

【每周分享】生成随机数:C语言rand和srand函数的使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每周分享】生成随机数:C语言rand和srand函数的使用方法
之前有坛友问我怎么样可以让每个设备产生随机的不一样的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范围的十进制数据即可。
编写的示例代码如下:
复制
  1. #define MAC_ADDRESS_SIZE (6)
  2. unsigned char MAC[MAC_ADDRESS_SIZE] = {0,0,0,0,0,0};
  3. unsigned char i =0;
  4. srand(time(0));
  5. for(i=0; i<MAC_ADDRESS_SIZE; i++)
  6. {
  7. MAC[i] =rand() %255;
  8. }
  9. 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信息等,都可以用同样的方法来操作。



---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3488152-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 23:25:14

攻克Temu、Shein测评采购下单难题,实现低砍单与F号率

硬件参数个性化处理在自养号运营中&#xff0c;确保硬件参数的唯一性至关重要。这需要借助设备指纹伪装技术&#xff0c;对 IMEI 号、MAC 地址、安全码等超过 20 项硬件参数进行修改&#xff0c;让每个自养号都拥有独一无二的设备标识。实现这一目标有两种常见方式。一种是借助…

作者头像 李华
网站建设 2026/8/21 23:00:18

设计模式学习(4) 23-1 单例模式

0.个人感悟 单例是老生常谈的模式。工作中也用的很多&#xff0c;比如各种全局管理类、工厂类。结合场景&#xff0c;选择合适的实现方式它核心思路是想办法让类只有一个实例&#xff0c;对外只提供一个获取实例的方法(封装)&#xff0c;然后是安全和效率考虑 自己实现 提前将…

作者头像 李华
网站建设 2026/8/19 14:47:53

java计算机毕业设计数字化商城的设计与实现 基于SpringBoot的线上购物商城系统的设计与实现 Java Web电商平台开发:商品管理与订单交易系统

计算机毕业设计数字化商城的设计与实现67ilu9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。流量即销量&#xff0c;疫情把“逛街”搬到指尖&#xff0c;传统铺面再豪华也抵不过…

作者头像 李华
网站建设 2026/8/21 21:48:10

Ascend C算子开发学习周报

Ascend C算子开发学习周报一、本周学习概述本周我首次接触华为昇腾Ascend C算子开发方向&#xff0c;主要从基本概念到编程模型的初步认知。由于是全新的技术领域&#xff0c;学习过程以理解基础架构和核心概念为主&#xff0c;具体细节和实践经验仍有待深化。二、学习内容详细…

作者头像 李华
网站建设 2026/8/20 17:27:17

3152419-206射频发电机

3152419-206 射频发电机 产品应用领域&#xff1a;半导体制造用于刻蚀、沉积、清洗等工艺过程中的等离子体激励与功率供给。平板显示与光电行业应用于 LCD、OLED 等面板制造中的薄膜沉积和等离子处理工艺。真空与等离子体工艺设备为真空腔体内的等离子体系统提供稳定、可控的射…

作者头像 李华