tag 标签: 随机数的产生

相关博文
  • 热度 16
    2012-2-27 16:11
    1986 次阅读|
    2 个评论
      初开始使用Arduino,在成功完成了最初的LED灯闪烁的程序以后,接下来就是熟悉具体的各种编程了,在Arduino中,作为一种互动媒体的器件和编程思想的承载者,最最主要的与外界交互的传感器,传感器分为很多种类,可以将外界的声音,气味,包括温度,等等一切可以模拟的量传入,而在Arduino的内心,通过我们的程序就可以将这些传入的模拟的信号(传入的端口是模拟输入的端口)进行相应的处理,然后我们就得到了我们想要的输出,如果从原理上看来,就是这样。   还是先把LED的代码贴上:   /*   Blink   Turns on an LED on for one second, then off for one second, repeatedly.     This example code is in the public domain.  */ int pin1=11; int pin2=12; int pin3=13; int xunhuan; int duandian1=9; int duandian2=18; int duandian3=27; void setup() {                  // initialize the digital pin as an output.   // Pin 13 has an LED connected on most Arduino boards:   pinMode(pin1, OUTPUT);   pinMode(pin2, OUTPUT);   pinMode(pin3, OUTPUT);   }   void loop() { if(xunhuanduandian1) {   shanshuo(pin1,50); } if(xunhuanduandian1-1xunhuanduandian2) {   shanshuo(pin2,50); } if(xunhuanduandian2-1xunhuanduandian3) {   shanshuo(pin3,50); } xunhuan++; if(xunhuan==150) { xunhuan=1; } }   void shanshuo(int pin,int shijian) {   digitalWrite(pin,HIGH);   delay(shijian);   digitalWrite(pin,LOW);   delay(shijian);   }   当然,到了具体的使用和编程和调试的时候也是这样的,首先,我开始了数字输入后的模拟输入端口的探究,模拟输入端口感知的对象是电压,这也正是传感器所做的事情,把各种量值表示的信号用电信号的变化来代表,而外界的环境是在不断的变化着的,实际上,我们的模拟端口(以A0为例)也在不断的变化着,那么这种变化时随机的吗?可以说是,也可以不是,但是这种时刻不断的变化的东西就可以生成几乎完全随机的东西了,那正是我们第一步中想要的效果,好了,开工。   如何能够看到端口的输入的信号的变化情况,是要连上LED之类的原件吗?恩,可以,但是在这里不用,我们可以看到编程IDE(集成环境)的界面的右上角有一个名叫Serial Monitor的按钮,在你运行起你的Arduino的时候,你可以点开它,然后输端的一举一动就都在你的监控之下了,可以加入一个延时的函数来进行一些便于观察的操作,比如每经过一秒钟产生一个观测,这样你就可以方便的记录和研究了。   好了,代码部分这里不具体贴出,就是一个探究的过程,然后每隔一秒你可以看到监视窗口中情况的变化,通过观测,发现数值的范围是0到1023,其实就是对电压0到5V的一个度量,我们不妨更近一步,变邪恶这样的一段代码:   int pin1=A0; int beginrate=9600; int suijishu=0; void setup() {    pinMode(pin1,INPUT);    Serial.begin(beginrate);   }   void loop() {    int duqu=analogRead(pin1);    int suijishu=hanshuchuli(duqu);    Serial.println(suijishu);    delay(1000); }   int hanshuchuli(int numtobehandle) {    int fanhuishu;    int zhongjianshu;    int zhongjianshu2;    int shuwei1;    int shuwei2;    int shuwei3;    int chuli;    zhongjianshu=numtobehandle*56.8;    zhongjianshu2=((zhongjianshu+3)/7*23+3);    chuli=zhongjianshu2;    shuwei1=chuli/999;    shuwei2=chuli/99;    shuwei3=chuli/9;    fanhuishu=shuwei1+shuwei2*3+shuwei3*17;    fanhuishu=fanhuishu%10;    if(fanhuishu0)    {      fanhuishu=fanhuishu*-1;    }    return fanhuishu; } 这个程序可以得到0到9之内的随机数字,但是当我真正运行起来的时候,我也发现这个并不是真正意义上的随机数。   但是,并不是意味着我们就无法得到真正的随机数了,如果你编过C语言的程序,你应该会记得那个产生随机数的过程,首先你可以设置一个用于产生随机数的种子,其实就这个种子的产生过程来说,有很多的方法,对电脑来说,最好的方法可能就是选取实时的时间的秒数或是从某个日期开始到某个时间节点为止的时间量,用秒来度量,或者用小时数来度量都可以。   然后你所做的就是调用一个系统中的函数,产生随机数,我编程的时候就用过这个,但是当时也不会知道真正的具体的过程,或者说在电脑中究竟怎么样的流程产生了这种随机数的东西。   但是,现在我们可以根据一个小小的芯片和一些外围设备来产生随机数了,而我们在这里的种子就是我们在模拟的输入端口得到的模拟的量,然后通过一些运算(加减乘除,取模,取反)得到另一个随机数,这样就产生了我们需要的随机数,好了,这个原理不难,实现也不难,但是在之前的观测中我说过,端口的检测结果显示,端口的输入数字似乎在周期性的变化,似乎是一个周期性的有规律的变化,这样就不妙了,即使是近似的周期性也可能是我们得到的随机数不在真正的随机,那么,有啥好办法来使这种周期性失效呢?   恩,这个也不算难,其实你好好想一想可以猜到方法(好的,给你5秒钟,5,4,3,2,1,想出来了吗?),我的方法就是再设置一个用于累加的变量,把之前产生的随机数来进行累加,这样即使在我们的近似的周期来到后,至少我们得到的累加的变量的值是变化了,这样我们还可以再在这样的基础上把这个累加的数字的几个分位取出再进行我们的处理,得到的数字就基本上一定是随机的。   好了,代码就在上面,还可以进行上述描述的算法改进,关于随机数的产生就说到这里了。   现在还是回到这个模拟的输入端口的使用上,接下来我要使用一个传感器,它就是热敏电阻,热敏电阻是10欧姆的规格,当温度上升的时候,它的电阻阻值就会变小,一直可以逼近0欧姆,那么,这种变化其实就可以被我们应用到电路中得到变化的电学量(电压电流都可以),这样我们对环境的温度就有了一个可以测量的手段,当然,精度的事情我们暂且不在这里讨论。   代码贴上:   int button=11; int gongdian=12; int control=A0; int led1=13; int buttonstate=0; int rate=9600; void setup() {    pinMode(button,INPUT);    pinMode(led1,OUTPUT);    pinMode(gongdian,OUTPUT);    digitalWrite(gongdian,HIGH);    pinMode(control,INPUT);    Serial.begin(rate); }   void loop() {       int controlin=analogRead(control);    Serial.println(controlin);    if(controlin1010)    {      digitalWrite(led1,LOW);    }    else    {      digitalWrite(led1,HIGH);    }    delay(100);     } 其中的controlin就是我们变化的衡量环境温度的变量,还记得前面我说的那个模拟输入的量的变化的范围吗?0到1023,你会发现我在这里使用的阀值是1010,恩,我使用的检测手段是体温,就是用手触摸一下,在手触摸的时候,电阻的阻值会变化,在这里具体的变化就是差不多到了0欧姆,也就是说,在环境温度达到37度的时候,它的电阻阻值就已经降到了底点了。   那么,这样我们的一个关于温度的传感器就基本上就雏形来说就好了,