51单片机如何生成随机数?

51单片机如何生成随机数?,第1张

用定时器加rand()随机函数来实现。

rnda=rand()%2

rndb=rand()%3

单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组

在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具体使用可看一看absacc.h便知,例如:

rval=CBYTE[0x0002]指向程序存贮器的0002h地址

rval=XWORD[0x0002]指向外RAM的0002h地址

_at_关键字

直接在数据定义后加上_at_ const即可,但是注意:

(1)绝对变量不能被初使化;

(2)bit型函数及变量不能用_at_指定。

例如:

idata struct link list _at_ 0x40指定list结构从40h开始。

xdata char text[25b] _at_0xE000;指定text数组从0E000H开始

提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

扩展资料:

统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。

密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。

真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。

参考资料来源:百度百科-随机数

1、C语言提供了一些库函数来实现随机数的产生。C语言中有三个通用的随机数发生器,分别为 rand函数, random函数, randomize 函数

2、但是rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。

3、在调用rand函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。

刚写的程序,我的思想是用定时器加rand()随机函数来实现的,单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。程序如下:#include<reg52.h>

#include<stdlib.h>//包含rand()随机函数的头文件

unsigned char t,k,i,j,a,f,n[10]

//t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组

void init() //初始化函数

{

t=0

i=0

f=0

k=0

TMOD=0x02 //设置定时器0为工作方式2

TH0=7 //装初值

TL0=7

EA=1 //开总中断

ET0=1 //开定时器0中断

TR0=1 //启动定时0

EX0=1//开外部中断0,同按键的效果一样

IT0=1 //下降沿触发

}

void main()

{

init()

while(1)

{

while(k) //外部中断0触发循环

{

if(!i) //i=0时取第一个随机数放入数组n[0]

{

srand(t)//随机数初始化

a=(char)(rand()%10)//取随机数(0~9)

n[0]=a //存入数组

i++ //数组下标加1

}

else

while(i<10) //存放剩下的9个随机数

{

srand(t)//随机数初始化

a=(char)(rand()%10) //取随机数

for(j=0j<ij++) //与前面的随机数比较

{

if(n[j]==a) //与前面的随机数相同

f=1 //标志置1

}

if(f) //有重复执行

{

f=0//标志清0

continue//结束本次循环

}

n[i]=a //不同则存入数组中

i++ //数组下标加1

}

}

}

}

void inter0() interrupt 0 //外部中断0

{

k=1//按键标志置1,主函数执行取随机数

}

void time0() interrupt 1 //定时器0中断

{

t++//时间加1

if(t==100) t=0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11018863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存