大家都知道单片机要生成随机数有一个比较简单的方法,就是用定时器的计数值来生成。
但是如果是要求在一定数据范围内生成一个随机数,并且与之前生成的随机数不能重复,那该怎么做?
想了个很傻瓜式的方法,用数组保存加遍历判断。
下面直接看代码:
typedef struct _RANDOM_INFO_ {
u8 buf[200];
u8 buf_cnt;
} RANDOM_INFO;
RANDOM_INFO random_info = {0};
static u32 usr_random_number(u32 start, u32 end)
{
if(end<=start)
{
return start;
}
//获得一个范围在start到end之间的随机数
return TIMER->CNT % (end-start+1) + start;
}
u8 usr_get_single_random_num(u8 min,u8 max)
{
u8 ran_num=0;
u8 i=0;
u8 is_find=0;
while(1)
{
is_find=0;
ran_num=usr_random_number(min,max);
for(i=0;i<max;i++)
{
if(ran_num==random_info.buf[i])
{
is_find=1;
break;
}
}
if(is_find==0)
{
random_info.buf[random_info.buf_cnt]=ran_num;
random_info.buf_cnt++;
if(random_info.buf_cnt>=max)
{
random_info.buf_cnt=0;
}
break;
}
}
return ran_num;
}
思路大概就是获取随机数,然后判断这个数是否已经保存在数组中(有保存说明之前已经有获取到这个数了),如果有这个数了则重新获取随机数,没有则保存到数组中。
另外,根据不同单片机的使用情况,定时器需要初始化。
只写了简单的8位,更高位数的此方法有可能不合适。
|