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