打印

C51 产生0-10的随机数怎么弄呢?

[复制链接]
14939|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wasay|  楼主 | 2011-3-27 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wangyy608| | 2011-3-27 20:34 | 只看该作者
一般的话用定时器产生一个数

使用特权

评论回复
板凳
coody| | 2011-3-27 23:09 | 只看该作者
程序自己产生的,不是随机的。。。。
我产生真正的随机数,都是 白噪声源+AD

使用特权

评论回复
地板
HWM| | 2011-3-27 23:42 | 只看该作者
re LZ:

srand() 是用于初始化随机函数种子的,之后需要用rand()来产生随机数。rand()所产生的随机数范围是可调,对RAND_MAX赋相应值即可。

rand()函数虽然产生的是0到RAND_MAX间均匀分布的伪随机数,但其统计特性理论上是精确的,用于统计算法的模拟完全没问题。如果想利用它做随机过程模拟的话,则需要解决“种子”问题。方法可以是存储种子以便下一次开机时使用,或利用计数器或其他硬件随机方法获得种子。

要注意的是,自然界中的“白噪声源”虽然是真随机数,但其分布函数并不是均匀分布。实际上其分布函数不明,不可以作为一个已知分布的随机变量来使用。

使用特权

评论回复
5
原野之狼| | 2011-3-28 00:24 | 只看该作者
用户的反应可以认为是随机的,比如开机之后你进行输入操作的时刻可以认为是随机的,linux下的随机数的种子就是这么弄的~

使用特权

评论回复
6
wasay|  楼主 | 2011-3-28 12:33 | 只看该作者
咱说的是C51   51单片机的。  跟linux不搭界的。   好心人能给个原码吗?  这个问题困扰我好久了。

使用特权

评论回复
7
HWM| | 2011-3-28 12:50 | 只看该作者
to 6L:

这个问题当然和Linux无关,前面已经说了相应的办法(存储种子或随机取计数器值)。有问题可以表达出来,这样别人也许更乐意帮助你。而直接要“原码”,别人不一定有现成适应你用的,且会让别人反感。

使用特权

评论回复
8
huangqi412| | 2011-3-28 13:29 | 只看该作者
咱说的是C51   51单片机的。  跟linux不搭界的。   好心人能给个原码吗?  这个问题困扰我好久了。
wasay 发表于 2011-3-28 12:33
上面不是有人回了么

使用特权

评论回复
9
cxd293757| | 2011-3-28 16:18 | 只看该作者
自己编写的,程序产生

使用特权

评论回复
10
老鱼探戈| | 2011-3-29 13:29 | 只看该作者
uchar  RandCnt;
uchar DRandData;

const uchar Table[]={...0-10...} ;    //顺序打乱一点
void Sub()
{
     ......................
     Rand++;         //可以在程序中经常操作的子函数中 放置
}
void main()
{
    .........
    while(1)
    {
     .............
      RandCnt++;
      ...........
     if(.....)  {DRandData=Table[RandCnt];}  //条件成立,取随机数
    }
}

使用特权

评论回复
11
wasay|  楼主 | 2011-4-2 22:00 | 只看该作者
谢谢楼上的代码。但是,这样做出的随机数也不是随机的。  
我已经用定时器做出来了,基本上是百分百随机的。 过两天我把代码贴出来(这台机器没有),让用得到的朋友少走点弯路。

使用特权

评论回复
12
xlsbz| | 2011-4-3 01:18 | 只看该作者
啥叫随机数?

使用特权

评论回复
13
chenczy| | 2011-4-3 17:28 | 只看该作者
找一个寄存器,开机是随机数的那个寄存器

使用特权

评论回复
14
wasay|  楼主 | 2011-4-5 14:23 | 只看该作者
#include<reg52.h>
#include<stdlib.h> //包含rand()随机函数的头文件
#include <stdio.h>                /* prototype declarations for I/O functions */

/*------------------------------------------------------------------------------
HELLO.C

Copyright 1995-2005 Keil Software, Inc.
------------------------------------------------------------------------------*/


#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
#endif                                   /* Stop Exection with Serial Intr.   */
                                         /* is enabled                                                  */


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=0x21;  //设置定时器0,1为工作方式2:8自动重装定时器/计数器                             
        TH0=(65536-65535)/256;
        TL0=(65536-65536)%256;

EA=1;   //开总中断
ET0=1;  //开定时器0中断
TR0=1;  //启动定时0
EX0=1; //开外部中断0,同按键的效果一样
    IT0=1;  //下降沿触发
       

#ifndef MONITOR51
    SCON  = 0x50;                        /* SCON: mode 1, 8-bit UART, enable rcvr      */
    //TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */
#endif


}



void main()
{
//unsigned char tmp_t,tmp_i;
unsigned int i,j;
init();
while(1)
{
         while(k) //外部中断0触发循环
          {                                                                                 
                   k=0;               
                   P3=0xff;

                         srand(TL0);
                         i=TL0%8;
                         j=TL0%8;
                         printf("rand=%d %d\n",i,j);
          }
  }
}
void inter0() interrupt 0 //外部中断0
{
k=1; //按键标志置1,主函数执行取随机数

}
void time0() interrupt 1 //定时器0中断
{        
        TH0=(65536-65536)/256;                         //取低8位
        TL0=(65536-65536)%256;                         //取高8位

}

这个是代码,思路是从定时器里取数。

使用特权

评论回复
15
wasay|  楼主 | 2011-4-5 14:24 | 只看该作者
打印的代码是从 HELLO WORD 示例里扒来的

使用特权

评论回复
16
sdpz| | 2011-4-6 13:48 | 只看该作者
狼说的很有道理。

使用特权

评论回复
17
ytlcainiao| | 2013-12-10 12:49 | 只看该作者
srand(32757);  //初始化随机数的初值
int a=rand()-32757;
a就是0-10之间的随机数

使用特权

评论回复
18
Zoe-yao| | 2014-5-15 15:31 | 只看该作者
感谢楼主,帮上大忙了。不过我测试了下那句srand好像不需要了,直接TL0就可以说是随机数了。

使用特权

评论回复
19
jackzmh| | 2015-5-14 16:18 | 只看该作者
我也需要用C51生成个随机数,参考一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

27

帖子

1

粉丝