查看: 842|回复: 2

[教程] pcDuino 随机数的问题

[复制链接]

34

主题

0

好友

463

积分

版主

Rank: 7Rank: 7Rank: 7

该用户从未签到

发表于 2014-4-18 10:23:49 |显示全部楼层
本帖最后由 cady 于 2014-4-18 10:25 编辑

pcDuino 随机数的问题
pcDuino兼容arduino的接口以及函数,所以pcDuino可以直接使用arduino的随机数函数
Random()来进行创建随机数。不过因为pcDuino支持其他很多语言的编程,所以我们也可以使用c语言的随机数函数rand()函数来实现。下面就来说说这两种方式各自的使用注意问题
Arduino的random函数使用格式如下;
int maxNum = 10;
int minNum = 1;
long randomNum = random (maxNum);//随机获取比maxNum 小的数
long randomNum = random (minNum, maxNum);//获得minMin -- maxNum-1之间的
但是其实Arduino的random 函数其实是根据某一种算法得出来的随机数。并不具备硬件随机。所以只要他的随机因子(也可以叫做起始值)不变的话,那么后面随机生成的数是不变的。我们可以写一个小程序验证一下
#include "core.h"

int randomNumber = 0;
int loopControl = 0;
int randomPin = A5;
void setup(){
}

void loop(){

    //int num = analogRead(A5);
    //printf ("num = %d\n", num);
    //randomSeed (num);
    for (loopControl = 1; loopControl <= 100; loopControl++){
        randomNumber = random (1, 101);
        printf ("%4d", randomNumber);
        if (!(loopControl % 10 )){
            printf ("\n");
        }
    }
    exit(0);
}

把上面程序拷贝到sample目录下命名为random_arduino.c
修改Makefile。然后执行可执行程序random_arduino结果如下
1.png

我们发现执行3次每次打印出来的100个数字都是一样的。
所以我们要通过randomSeed()函数来给他设定一个随机因子
我们如何让这个随机因子是真正意义上的随机呢?
arduino上一般采用读取A0-A5上的值来作为随机因子,因为如果没有外接信号的传入,arduino上ADC的采样值是会随机变化的,人为不可预测。
所以pcDuino原理上也可以使用例如:
randomSeed (analogRead (5));
来设定随机因子。但是其实pcDuino和arduino还是有所不同。
pcDuino的A0-A5口在没有外界信号接入的时候是默认上拉的,会一直读出最大值
所以这里我们给pcDuinoA5和GND之间接上一个光敏电阻。然后打开上面代码的注释部分。
发现结果如图所示;
2.png

num读出来的是analogRead读出来的值。后面是新随机出来的100个数
我们同样执行3次。这次产生的随机数就发生了变化。
然后我们使用c语言的srand函数和rand函数来进行实验看看。
srand函数的作用和randomSeed的作用差不多都是生成一个随机因子,这里我们使用滚滚前进的时间来作为随机因子,因为时间总是在不停的变化。程序如下:
#include "core.h"

int loopControl = 0;
int randomNum = 0;

void setup(){}

void loop(){
    for (loopControl = 1; loopControl <= 100; loopControl++){
        srand(time(0));//从1970年1月1日至今的秒数作为随机因子
        randomNum = rand()%100 + 1;
        printf ("%4d", randomNum);
        delay (1000);
        if (!(loopControl %  10)){
            printf ("\n");
        }
    }
    exit(0);
}

然后 实验结果如下:
3.png

回复

使用道具 举报

0

主题

0

好友

27

积分

白丁

Rank: 1

  • TA的每日心情
    无聊
    2014-4-30 08:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-4-21 15:22:15 |显示全部楼层
    这样做可以,随机数的产生需要引子,如果用时间做引子,随机数产生的会相同。但用模拟口的值做引子,就不同了,模拟口的值是浮动的。
    回复

    使用道具 举报

    25

    主题

    6

    好友

    5237

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    擦汗
    2016-11-18 12:44
  • 签到天数: 900 天

    [LV.10]以坛为家III

    发表于 2014-5-29 09:30:59 |显示全部楼层
    不错  学习了                  
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-6 08:53 , Processed in 0.092501 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部