微软官方MSDN原版Win10系统下载

现在位置: 首页  > 系统教程  > 系统帮助

单片机如何产生随机数

时间:2024-05-19 12:17:58   

大家好,今天Win10系统之家小编给大家分享「单片机如何产生随机数」的知识,如果能碰巧解决你现在面临的问题,记得收藏本站或分享给你的好友们哟~,现在开始吧!

生意如何小账本专业版-小商户销售和存货记账系列软件最新版本下载

1.[请教高手]单片机怎么实现产生随机数?


  给你一个超强例子:欢迎到卡卡空间:http://hi.baidu.com/woodking主nbsp;nbsp;nbsp;nbsp;题:nbsp;线性叠加伪随机数函数;nbsp;关nbsp;键nbsp;词:nbsp;随机数,8位单片机,random,8nbsp;bitnbsp;mcu;nbsp;参考资料:nbsp;1.amp;lt;amp;lt;linearnbsp;congruentialnbsp;pseudo-randomnbsp;numbernbsp;generatornbsp;routinesamp;gt;amp;gt;;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;bynbsp;brucenbsp;clark,nbsp;7nbsp;junnbsp;2004;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;2.amp;lt;amp;lt;thenbsp;artnbsp;ofnbsp;computernbsp;programming,nbsp;volumenbsp;2amp;gt;amp;gt;;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;bynbsp;donaldnbsp;knuth;nbsp;nbsp;nbsp;nbsp;nbsp;8位单片机很多地方需要随机数,比如游戏的洗牌,可在timer中取数,但是随机数质量不高。随机数是一个既简单又复杂的问题,这里的例子使用了众所周知的线性叠加法,没有完美的方法产生随机数,不过线性叠加法是一个合适的方法,彻底解决8位机随机数的问题。nbsp;nbsp;nbsp;nbsp;伪随机数函数总是返回可预知的数字,像抛骰子,如果抛足够多次,那么我们得到了一个足够长的数字序列,nbsp;nbsp;nbsp;nbsp;3,1,5,1,4,6,5,4,6,5,4,5,6,1,3,2,1,6,4,6,5,4,3,2,1,3,2,1,4,2,3,1,3......nbsp;nbsp;nbsp;nbsp;如果从序列中一个接一个的取出数字,那么数字就看似随机。nbsp;nbsp;nbsp;nbsp;问题的关键是从这序列的哪个点(数字)开始取数?这个开始的点(数字)叫做种子。nbsp;nbsp;nbsp;nbsp;注意,如果从相同的点(种子)开始,将会得到相同的数字,这是因为我们是从固定的序列中取数字(所以叫伪随机)。但这却是一个有用的特性,我们可以每次从不同的点取数,即改变种子!nbsp;nbsp;nbsp;nbsp;在6502上,8位或16位随机数是最常用的,函数返回一个32位的数字,范围0~2^32。名词“线性叠加“听起来容易范晕,nbsp;其实只涉及二个内容:乘法和加法。三个步骤:nbsp;1.nbsp;为了取得新的种子(也就是从序列开始的那个点的数字),旧的种子和一个常数a相乘,nbsp;2.nbsp;所得结果然后和第二个常数c相加。nbsp;3.nbsp;新的种子是结果的低32位(记住,这个函数返回32位数字)。保留低32位很重要,用来获nbsp;nbsp;nbsp;nbsp;得下一个种子。nbsp;nbsp;nbsp;nbsp;计算公式:nbsp;nbsp;nbsp;nbsp;种子nbsp;=nbsp;anbsp;*nbsp;种子nbsp;+nbsp;cnbsp;此公式在几何图中表示一条直线,而且新种子由旧种子反复相加得来,所以叫线性叠加。nbsp;nbsp;nbsp;nbsp;随机数函数的关键在于选择优秀的“常数a“(也叫乘数a),其实也就是选择了一个固定的数字序列。“常数c“,不像乘数a那样重要,但是它一定是个奇数。事实上,nbsp;c可选1,而且这是例程所使用的,因为它会简化计算。nbsp;nbsp;nbsp;nbsp;注意,奇数(旧的种子)乘奇数(乘数a)是奇数,再加奇数(常数c)将会是一个偶数;偶数(旧的种子)乘奇数(乘数a),加奇数(常数c)将会是一个奇数。如此种子将会在奇数和偶数之间转变。因为种子的变化足够随机,所以新种子的值可以作为8位或16位随机数。nbsp;nbsp;nbsp;nbsp;子程序f_randomseed,计算nbsp;“种子nbsp;=nbsp;乘数nbsp;*nbsp;种子+1“nbsp;(记得,c=1)。有三个版本:nbsp;(1)nbsp;快速版本,nbsp;速度快,但占用rom多。nbsp;(2)nbsp;兼顾版本,速度和占用rom适中,空间和速度是在另外二个版本之间。nbsp;nbsp;nbsp;nbsp;nbsp;兼顾版b,nbsp;使用了另一个神奇的数字66066(10进制).nbsp;(3)nbsp;最小版本,速度慢,但占用rom小。nbsp;nbsp;nbsp;nbsp;三个版本中使用的乘数1664525(10进制)=19660d(16进制),是从amp;lt;amp;lt;计算机程序的艺术,第2册amp;gt;amp;gt;一书中选出,这是一个神奇的数字,经过论证和测试,这个数字对产生随机数至关重要。想进一步研究的朋友可以阅读原著(参考资料2),书中以特别专业的数学方法讨论了随机数问题。这里只是应用了其中的两个常数1664525(10进制)和69069(10进制),这里不作讨论,因为篇幅问题是借口,其实自己没弄懂。;==============================================================================;nbsp;快速版本;===================

2.怎么让51单片机产生随机数?


  刚写的程序,我的思想是用定时器加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=0;j<i;j++) //与前面的随机数比较
  { 
  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; 
}

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


  用定时器加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”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
  密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
  真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
  参考资料来源:

以上就是关于「单片机如何产生随机数」的全部内容,本文讲解到这里啦,希望对大家有所帮助。如果你还想了解更多这方面的信息,记得收藏关注本站~

Win10系统之家②文章,转载请联系!】

相关文章

  • c  如何产生随机数

    c 如何产生随机数

    1.c++如何产生随机数本文由青松原创并依gpl-v2及其后续版本发放,转载请注明出处且应包含本行声明。c++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-randomintegralnumber)。生成随机数时需...
  • 一氧化碳如何产生

    一氧化碳如何产生

    1.怎样制造一氧化碳?可以用以下方法制取CO:1、取过量的木炭在少量的氧气中燃烧,由于氧气不足,因此可以产生一氧化碳。化学方程式是:C+O?=点燃=CO2、甲酸与浓硫酸共热可以产生一氧化碳。浓硫酸作为催化剂,催化甲酸的分解。...
  • 亚硝酸盐如何产生

    亚硝酸盐如何产生

    1.食物中亚硝酸盐是怎样产生的硝酸盐和亚硝酸盐广泛存在于自然界的土壤及水域。一些植物体内也含有硝酸盐,不同的品种含量不同,如绿色蔬菜中的甜菜、莴苣、菠菜、芹菜及萝卜等硝酸盐含量都比较高。这是由于农作物栽培,使...
  • 大数据如何产生的

    大数据如何产生的

    1.大数据现象是怎么形成的?大数据是无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。在维克...