"); //-->
在单片机程序编写中,常常需要使用随机数字,如何产生随机数的方法有许多,常见的是用一个简单的算法计算出随机数,这样就可以得到一个数学理论上是随机分布的随机数序列。
我个人不习惯使用这种方法:首先是使用的人理解计算用的数学公式会比较难;其次虽然序列整体看是随机数组合,但每次开机后都得到同样随机数序列,对应用程序来说并不完全符合随机状态;另外还需要比较多的程序代码才能实现。
我在程序中对于随机数的生成一般都不用公式的方法,而是直接利用硬件的特性来产生。
方法一:
利用定时中断,创建一个1毫秒的定时中断程序,里面对一个计数器进行累加,在程序需要使用随机数的时候就使用这个计数器的值。只要程序有人机交互功能,一旦人有进行选择控制,做出选择控制的时间对机器来说无疑是绝对随机,因为人和机器完全独立,机器并不知道人会在什么时候做出选择。就算是两个人看到机器某个提示立即按下某个键,表面看好像两个人是同时做出反应,如果把时间细分,这两个人就不可能是绝对同时反应,一定会存在一个时间差。想一想,人的反应速度能达到毫秒级别吗?所以如果是一个16位的毫秒计数器,就可以提供65536种可能给应用程序,重复的可能性已经相当小。
该方法不足时会占用一定的系统资源,比如一个指令速度为8MHz的8位单片机,假定定时中断需要占用20个指令周期,中断程序会占用单片机约0.2%的运行时间。
方法二:
利用ADC,我们知道电路上电后会有噪声,这个噪声可以被看做随机干扰,如果用ADC测量这个噪声,得到的同样是随机数。该方法不足主要是噪声一般只有几十毫伏,不能得到精度很高的随机数,尤其是8位ADC,效果会不太理想,最好是12位以上的ADC才有比较好的效果。
方法三:
方法一合方法二组合使用,用这两种方法产生的连个不同随机数经过运算得出新的随机数。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
eleaction01 阅读:2943