打印

keil中如何产生随机数?

[复制链接]
14679|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyindance8564|  楼主 | 2010-4-15 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lovewwy| | 2010-4-15 13:34 | 只看该作者
mark ,学习

使用特权

评论回复
板凳
winhi| | 2010-4-15 14:33 | 只看该作者
我之前产生随机数的方法是利用timer计数值做的

使用特权

评论回复
地板
ayb_ice| | 2010-4-15 16:06 | 只看该作者
真正的随机数要用专门的硬件随机数发生器

使用特权

评论回复
5
flyindance8564|  楼主 | 2010-4-15 16:17 | 只看该作者
4# ayb_ice

我只要产生一个伪随机数  怎么产生呢?

使用特权

评论回复
6
flyindance8564|  楼主 | 2010-4-15 16:17 | 只看该作者
3# winhi

有例程发上来看看么...?

使用特权

评论回复
7
ayb_ice| | 2010-4-15 16:24 | 只看该作者
伪随机数用rand和srand,具体用法可以查看相关帮助文档

使用特权

评论回复
8
laslison| | 2010-4-15 16:46 | 只看该作者
用其他软件产生不行吗

使用特权

评论回复
9
lxgrch| | 2010-4-15 18:23 | 只看该作者
需要一个存储种子的介质比如EEPROM或flash等,每次读出种子去rand用的同时把种子按照某个原则给修改下

使用特权

评论回复
10
flyindance8564|  楼主 | 2010-4-15 19:09 | 只看该作者
9# lxgrch

谢谢,我是新手,能说的再详细点么?

我用的是at89s52,设想是这样的:接受到某个特定信号后,单片机随机延时一段时间,然后做出回应,问题就出在如何随机延时?

使用特权

评论回复
11
flyindance8564|  楼主 | 2010-4-15 19:10 | 只看该作者
7# ayb_ice


可是srand获取种子的时候从哪里获取呢?  这是让我头疼的一个问题

使用特权

评论回复
12
maomao2126| | 2010-4-15 20:26 | 只看该作者
将timer 打开,需要种子的时候读timer的值,按照某个方法++--*%后作为种子用

使用特权

评论回复
13
flyindance8564|  楼主 | 2010-4-15 21:10 | 只看该作者
12# maomao2126

#include<reg52.h>
#include<stdlib.h>
.
.
.  省略
.
.
void time0()
{
TMOD=0x02;        //设置定时器0为工作方式2
TH0=0;   
TL0=0;   
TR0=1;         //启动定时器0  
}

main()
{.
.
.
.

   uint u;
   srand(TH0);   //获取种子
   u=rand();
   Delay_ms(u);
.
.
.
.
.
}


这样可以吗?

使用特权

评论回复
14
古道热肠| | 2010-4-15 21:34 | 只看该作者
我是将每次生成的随机数存入EEPROM,下次初始化Srand时读EEPROM的值作为种子,能保证每次开机不出同样的随机数。

使用特权

评论回复
15
Mindor| | 2010-4-16 08:10 | 只看该作者
14# 古道热肠
嗯~不错的方法哈~

使用特权

评论回复
16
sytu_chyq| | 2010-4-16 09:19 | 只看该作者
xuexi

使用特权

评论回复
17
灵动系统| | 2010-4-16 09:22 | 只看该作者
用到了再来看看吧!

使用特权

评论回复
18
flyindance8564|  楼主 | 2010-4-16 13:07 | 只看该作者
14# 古道热肠

能把例程发上来看看么?

使用特权

评论回复
19
flyindance8564|  楼主 | 2010-4-17 10:51 | 只看该作者
#include<reg52.h>
#include<stdlib.h>
......
uint tt;

void init_time0()
{
        tt=0;
        TMOD=0x02;        //设置定时器0为工作方式2
        TH0=6;                               
        TL0=7;                               
        EA=1;             //开总中断
        ET0=1;                //开定时器0中断
        TR0=1;                //启动定时器0
       
}

void time0() interrupt 1
{       
        tt++;
}

main()
{
               init_time0();
                 ....
           uint u;
                if(tt==100)tt=0;
        srand(tt);      
        u=(rand()%100);
                Delay_ms(u);
                ...
}

程序比较简陋,高手看一下有问题么?

使用特权

评论回复
20
yxflovecy| | 2010-4-17 10:57 | 只看该作者
我是来看回复的。。  学习

使用特权

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

本版积分规则

12

主题

52

帖子

1

粉丝