新闻  |   论坛  |   博客  |   在线研讨会
我常用的简单随机数产生方法
sjdai | 2010-03-11 13:29:15    阅读:11620   发布文章

        在单片机程序编写中,常常需要使用随机数字,如何产生随机数的方法有许多,常见的是用一个简单的算法计算出随机数,这样就可以得到一个数学理论上是随机分布的随机数序列。

        我个人不习惯使用这种方法:首先是使用的人理解计算用的数学公式会比较难;其次虽然序列整体看是随机数组合,但每次开机后都得到同样随机数序列,对应用程序来说并不完全符合随机状态;另外还需要比较多的程序代码才能实现。

        我在程序中对于随机数的生成一般都不用公式的方法,而是直接利用硬件的特性来产生。

        方法一:
        利用定时中断,创建一个1毫秒的定时中断程序,里面对一个计数器进行累加,在程序需要使用随机数的时候就使用这个计数器的值。只要程序有人机交互功能,一旦人有进行选择控制,做出选择控制的时间对机器来说无疑是绝对随机,因为人和机器完全独立,机器并不知道人会在什么时候做出选择。就算是两个人看到机器某个提示立即按下某个键,表面看好像两个人是同时做出反应,如果把时间细分,这两个人就不可能是绝对同时反应,一定会存在一个时间差。想一想,人的反应速度能达到毫秒级别吗?所以如果是一个16位的毫秒计数器,就可以提供65536种可能给应用程序,重复的可能性已经相当小。
        该方法不足时会占用一定的系统资源,比如一个指令速度为8MHz的8位单片机,假定定时中断需要占用20个指令周期,中断程序会占用单片机约0.2%的运行时间。

        方法二:
        利用ADC,我们知道电路上电后会有噪声,这个噪声可以被看做随机干扰,如果用ADC测量这个噪声,得到的同样是随机数。该方法不足主要是噪声一般只有几十毫伏,不能得到精度很高的随机数,尤其是8位ADC,效果会不太理想,最好是12位以上的ADC才有比较好的效果。

        方法三:
        方法一合方法二组合使用,用这两种方法产生的连个不同随机数经过运算得出新的随机数。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
sjdai  2010-03-13 14:10:30 

呵呵,都是小方法,不见得非常符合理论,只是个人觉得可以这样用

智达  2010-03-13 13:01:00 

方法一 很巧妙。

啰嗦一些以单片机应用为主的电子技术问题,偶尔发点牢骚。如果您想我了,邮件(daishangju@163.com)和MSN(sj_dai@hotmail.com)都能找到我。本博客提供《删繁就简-单片机入门到精通》一书下载链接,点击最底部的“查看更多”可翻页。
推荐文章
最近访客