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

[复制链接]
16507|18
 楼主| wasay 发表于 2011-3-27 20:03 | 显示全部楼层 |阅读模式
C51  产生0-10的随机数怎么弄呢?  研究了N久,都不随机的啊。   用srand  都没用啊。
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间均匀分布的伪随机数,但其统计特性理论上是精确的,用于统计算法的模拟完全没问题。如果想利用它做随机过程模拟的话,则需要解决“种子”问题。方法可以是存储种子以便下一次开机时使用,或利用计数器或其他硬件随机方法获得种子。

要注意的是,自然界中的“白噪声源”虽然是真随机数,但其分布函数并不是均匀分布。实际上其分布函数不明,不可以作为一个已知分布的随机变量来使用。
原野之狼 发表于 2011-3-28 00:24 | 显示全部楼层
用户的反应可以认为是随机的,比如开机之后你进行输入操作的时刻可以认为是随机的,linux下的随机数的种子就是这么弄的~
 楼主| wasay 发表于 2011-3-28 12:33 | 显示全部楼层
咱说的是C51   51单片机的。  跟linux不搭界的。   好心人能给个原码吗?  这个问题困扰我好久了。
HWM 发表于 2011-3-28 12:50 | 显示全部楼层
to 6L:

这个问题当然和Linux无关,前面已经说了相应的办法(存储种子或随机取计数器值)。有问题可以表达出来,这样别人也许更乐意帮助你。而直接要“原码”,别人不一定有现成适应你用的,且会让别人反感。
huangqi412 发表于 2011-3-28 13:29 | 显示全部楼层
咱说的是C51   51单片机的。  跟linux不搭界的。   好心人能给个原码吗?  这个问题困扰我好久了。
wasay 发表于 2011-3-28 12:33
上面不是有人回了么
cxd293757 发表于 2011-3-28 16:18 | 显示全部楼层
自己编写的,程序产生
老鱼探戈 发表于 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];}  //条件成立,取随机数
    }
}
 楼主| wasay 发表于 2011-4-2 22:00 | 显示全部楼层
谢谢楼上的代码。但是,这样做出的随机数也不是随机的。  
我已经用定时器做出来了,基本上是百分百随机的。 过两天我把代码贴出来(这台机器没有),让用得到的朋友少走点弯路。
xlsbz 发表于 2011-4-3 01:18 | 显示全部楼层
啥叫随机数?
chenczy 发表于 2011-4-3 17:28 | 显示全部楼层
找一个寄存器,开机是随机数的那个寄存器
 楼主| 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位

}

这个是代码,思路是从定时器里取数。
 楼主| wasay 发表于 2011-4-5 14:24 | 显示全部楼层
打印的代码是从 HELLO WORD 示例里扒来的
sdpz 发表于 2011-4-6 13:48 | 显示全部楼层
狼说的很有道理。
ytlcainiao 发表于 2013-12-10 12:49 | 显示全部楼层
srand(32757);  //初始化随机数的初值
int a=rand()-32757;
a就是0-10之间的随机数
Zoe-yao 发表于 2014-5-15 15:31 | 显示全部楼层
感谢楼主,帮上大忙了。不过我测试了下那句srand好像不需要了,直接TL0就可以说是随机数了。
jackzmh 发表于 2015-5-14 16:18 | 显示全部楼层
我也需要用C51生成个随机数,参考一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

27

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部