Keil C51 中产生随机数的方法

在Keil C51开发环境中,生成随机数是嵌入式系统编程中常见的需求,尤其在游戏、加密算法、测试工具等领域。本文将详细介绍在Keil C51中如何使用标准库函数`rand()`和`srand()`来生成随机数,并通过实例代码进行演示。 ### 1. 使用`rand()`与`srand()` `rand()`函数是C标准库中的一个伪随机数生成器,其原型定义在`<stdlib.h>`头文件中。`rand()`函数返回一个范围在0到RAND_MAX之间的整数(RAND_MAX常量通常定义为32767)。然而,`rand()`函数生成的序列实际上是可预测的,因为它依赖于一个初始种子值。为了确保每次程序运行时都能得到不同的随机数序列,我们通常会使用`srand()`函数来设置这个种子。 #### `srand()`函数 `srand()`函数的原型同样位于`<stdlib.h>`中,它接受一个整型参数作为种子,用于初始化`rand()`函数的随机数生成器。同`rand()`不同的是,`srand()`没有返回值。一旦调用了`srand()`函数,之后的每一次`rand()`调用都会基于这个种子生成新的随机数序列。 #### 示例代码 以下代码展示了如何使用`srand()`和`rand()`生成随机数: ```c #include <stdlib.h> #include <stdio.h> void tst_srand(void) { int i = 0; int r = 279165921; srand(56); // 设置随机数种子 for (i = 0; i < 10; i++) { printf("I=%d, RAND=%d\n", i, rand()); } } ``` 在这个例子中,我们首先调用`srand()`函数设置了一个固定的种子值56,然后在循环中连续调用`rand()`函数10次,打印出每次生成的随机数。 ### 2. 利用硬件时钟作为种子 虽然使用固定数值作为`srand()`函数的参数可以方便地进行测试和调试,但在实际应用中,我们往往需要一个更随机的种子来源。一个常见的做法是利用微控制器的硬件时钟作为随机种子。这种方法可以确保每次程序启动时,都有一个不同的种子值,从而产生不同的随机数序列。 以下是一个使用硬件时钟作为随机种子的例子: ```c void main(void) { unsigned TH0, TL0; TH0 = _crol_(0x18, 1); // 高8位时钟计数器 TL0 = _cror_(0xE0, 1); // 低8位时钟计数器 srand((TH0 << 8) | TL0); // 将高8位和低8位组合起来作为种子 int i = rand(); // 生成随机数 } ``` 在这个示例中,我们使用了Keil C51特有的`_crol_`和`_cror_`旋转指令来读取微控制器的时钟计数器,然后将高8位和低8位组合成一个16位的整数,用作`srand()`函数的参数。 ### 结论 在Keil C51中生成随机数可以通过调用`rand()`和`srand()`函数实现,其中`srand()`用于初始化随机数生成器的种子,而`rand()`则生成实际的随机数。为了提高随机性的质量,可以考虑使用硬件时钟等物理量作为种子来源,从而避免每次程序运行时都产生相同的随机数序列。



























1. 摘录KEIL C51 帮助文件中的说明:
srand
#include <stdlib.h>
void srand (int seed); /* random number generator seed */
Description:
The srand function sets the starting value seed used by the pseudo-random number generator in the rand function. The random number generator produces the same sequence of pseudo-random numbers for any given value of seed.
Return Value:
None.
Attributes:
non-reentrant
See Also:
rand
Example
#include <stdlib.h>
#include <stdio.h> /* for printf */
void tst_srand (void) {
int i=0;
int r=279165921;
srand (56);
for (i = 0; i < 10; i++) {

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 城市供热管网广域分散型数据监控系统.doc
- 三期水电安装监理细则(1).doc
- 电力工程概预算基础知识.ppt
- 科幻电影中人工智能伦理意识探析.docx
- 赣龙铁路项目部成本管理探析.doc
- 园林景观常用造价知识.pptx
- 绩效管理与绩效面谈培训教程.doc
- 华为公司优秀研发员工的素质模型.doc
- 电子类专业英语词汇-.doc
- 数据库课程设计之电脑销售信息管理系统.doc
- 企业档案管理规范.doc
- 环氧树脂涂层地面施工方法.doc
- 电梯机房、井道建筑、安装交接检记录.docx
- 国家体育场(鸟巢)的施工组织设计(测量方案部分).doc
- 第四章-火灾报警控制器.ppt
- 大数据背景下强化档案信息服务的途径分析.docx



- 1
- 2
- 3
前往页