单片机生成随机数的方法总结
2015-06-24 12:30
489 查看
去年冬天在帮学校附近一家密室逃脱店做一些电子机关,其中一个打地鼠项目需要用到单片机产生随机数,用于实现随机让几个地鼠“钻”出来。一开始想法很单纯,不就是随机函数么,之前C语言课上就学过啦。可是真正用这个方法做了之后却发现并没有想象之中那么简单,程序像是写死的,复位后每次的顺序都是固定的,并没有随机的效果,于是我仔细研究了一下,总结了单片机生成随机数的几种常见方法。
首先,要明确一点:一个独立的单片机系统,如果不引入一个随机信号,永远不能实现随机的效果。这里的随机信号可以是用户的交互、时间、采集的外部数据等等,我们常用伪随机数列+随机数种子的方式实现随机的效果,而这些随机信号就是用来做随机数种子。
我使用的生成伪随机数代码如下:
或者利用srand()函数,将上述函数改写成
说明:
srand()函数位于<stdlib.h>表头文件中,用来设置rand()产生随机数时的随机数种子。
定义函数 void srand (unsigned int seed);
参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
在上述程序中将用户按下按键时定时器中的ms时间值后两位作为函数的输入参数,这样就能获得一个随机值。
单片机生成随机数的几种常用随机信号如下:
1. 用一路AD采集温度或电源噪声,取后几位作为随机信号;
2. 将用户的交互信号时间作为随机信号;
3. 利用时钟芯片或RTC获取当前时间再经处理作为随机信号;
4. 自己搭一个硬件电路用来产生随机信号,如利用单片机的内置时钟设为1M,外接一个用温度敏感电阻搭建一个特征频率10M的RC振荡电路,用慢时钟去采集快时钟,然后经过简单处理,就可以得到一个真正的随机数了。
首先,要明确一点:一个独立的单片机系统,如果不引入一个随机信号,永远不能实现随机的效果。这里的随机信号可以是用户的交互、时间、采集的外部数据等等,我们常用伪随机数列+随机数种子的方式实现随机的效果,而这些随机信号就是用来做随机数种子。
我使用的生成伪随机数代码如下:
…… #include<stdlib.h> …… #define MAX 16 //随机数最大值 #define MIN 1 //随机数最小值 unsigned int random(unsigned int xxx) { unsigned int value,iii; for(iii=0;iii<xxx;iii++) { value = rand() % (MAX + 1- MIN) + MIN; //获取一个随机数(1-16) } return value; }
或者利用srand()函数,将上述函数改写成
unsigned int random(unsigned int xxx) { unsigned int value; srand(xxx); value = rand() % (MAX + 1 - MIN)+ MIN; //获取一个随机数(1-16) return value; }
说明:
srand()函数位于<stdlib.h>表头文件中,用来设置rand()产生随机数时的随机数种子。
定义函数 void srand (unsigned int seed);
参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
在上述程序中将用户按下按键时定时器中的ms时间值后两位作为函数的输入参数,这样就能获得一个随机值。
单片机生成随机数的几种常用随机信号如下:
1. 用一路AD采集温度或电源噪声,取后几位作为随机信号;
2. 将用户的交互信号时间作为随机信号;
3. 利用时钟芯片或RTC获取当前时间再经处理作为随机信号;
4. 自己搭一个硬件电路用来产生随机信号,如利用单片机的内置时钟设为1M,外接一个用温度敏感电阻搭建一个特征频率10M的RC振荡电路,用慢时钟去采集快时钟,然后经过简单处理,就可以得到一个真正的随机数了。
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- Lua教程(四):在Lua中调用C语言、C++的函数
- C语言求幂计算的高效解法
- C语言实现输入一颗二元查找树并将该树转换为它的镜像
- 12个关于C语言的有趣问答
- 探讨register关键字在c语言和c++中的差异