zoukankan      html  css  js  c++  java
  • 单片机生成随机数的方法总结

          去年冬天在帮学校附近一家密室逃脱店做一些电子机关,其中一个打地鼠项目需要用到单片机产生随机数,用于实现随机让几个地鼠“钻”出来。一开始想法很单纯,不就是随机函数么,之前C语言课上就学过啦。可是真正用这个方法做了之后却发现并没有想象之中那么简单,程序像是写死的,复位后每次的顺序都是固定的,并没有随机的效果,于是我仔细研究了一下,总结了单片机生成随机数的几种常见方法。

         首先,要明确一点:一个独立的单片机系统,如果不引入一个随机信号,永远不能实现随机的效果。这里的随机信号可以是用户的交互、时间、采集的外部数据等等,我们常用伪随机数列+随机数种子的方式实现随机的效果,而这些随机信号就是用来做随机数种子。

         我使用的生成伪随机数代码如下:

    ……
    #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振荡电路,用慢时钟去采集快时钟,然后经过简单处理,就可以得到一个真正的随机数了。

     

     

     

     

     

  • 相关阅读:
    OpenCV---在图片上加入文字
    DosBox 报错 this program requires dosxnt.exe to be in your path
    iOS开发-UITableView单选多选/复选实现1
    LeetCode第七题,Reverse Integer
    【PostgreSQL】PostgreSQL操作-psql基本命令
    Bootstrap的js插件之弹出框(popover)
    Qt Quick 图像处理实例之美图秀秀(附源代码下载)
    【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用
    用Visual Studio高版本号打开低版本号的project,转换时出现错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    如何安装ArchLinux
  • 原文地址:https://www.cnblogs.com/yucen/p/9343587.html
Copyright © 2011-2022 走看看