随机数

[复制链接]
2199|23
 楼主| zwll 发表于 2014-10-13 19:31 | 显示全部楼层 |阅读模式
看了很多帖子,说用用srand产生种子,然后rand()产生随机数
但是种子必须每次不一样的
C语言中time.h可以产生种子:srand((unsigned int)time(NULL))

可是keil中没有time.h    即使我把C库函数中的time.h复制到keil相应文件夹下也不管用

请教高手如何产生随机数呢?
午夜粪车 发表于 2014-10-13 19:31 | 显示全部楼层
我之前产生随机数的方法是利用timer计数值做的
shimx 发表于 2014-10-13 19:33 | 显示全部楼层
真正的随机数要用专门的硬件随机数发生器
jiaxw 发表于 2014-10-13 19:33 | 显示全部楼层
我只要产生一个伪随机数  怎么产生呢?
chuxh 发表于 2014-10-13 19:34 | 显示全部楼层
用其他软件产生不行吗
juventus9554 发表于 2014-10-13 19:35 | 显示全部楼层
需要一个存储种子的介质比如EEPROM或flash等,每次读出种子去rand用的同时把种子按照某个原则给修改下
午夜粪车 发表于 2014-10-13 19:36 | 显示全部楼层
伪随机数用rand和srand,具体用法可以查看相关帮助文档
 楼主| zwll 发表于 2014-10-13 19:36 | 显示全部楼层
能详细点吗,我设想是这样的:接受到某个特定信号后,单片机随机延时一段时间,然后做出回应,问题就出在如何随机延时?
 楼主| zwll 发表于 2014-10-13 19:38 | 显示全部楼层
srand获取种子的时候从哪里获取呢?  这是让我头疼的一个问题
juventus9554 发表于 2014-10-13 19:39 | 显示全部楼层
将timer 打开,需要种子的时候读timer的值,按照某个方法++--*%后作为种子用
 楼主| zwll 发表于 2014-10-13 19:40 | 显示全部楼层
#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);
.
.
.
.
.
}


这样可以吗?
司徒老鹰 发表于 2014-10-13 19:40 | 显示全部楼层
我是将每次生成的随机数存入EEPROM,下次初始化Srand时读EEPROM的值作为种子,能保证每次开机不出同样的随机数。
 楼主| zwll 发表于 2014-10-13 19:45 | 显示全部楼层
#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);
                 ...
}

程序比较简陋,高手看一下有问题么?
llljh 发表于 2014-10-13 19:46 | 显示全部楼层
dingy 发表于 2014-10-13 19:48 | 显示全部楼层
用IC卡就可以产生不错的随机数。
pengf 发表于 2014-10-13 19:48 | 显示全部楼层
在while(1)中,搞一个变量累加,也可当作伪随机数
renyaq 发表于 2014-10-13 19:50 | 显示全部楼层
pengf 发表于 2014-10-13 19:48
在while(1)中,搞一个变量累加,也可当作伪随机数



这个我试了,存在好多问题变量累加需要时间,而且随机性不强
ousj 发表于 2014-10-13 19:51 | 显示全部楼层
13楼的办法是有问题的。关键在于,执行到srand(tt);这句之前的时间是否是确定性的。如果是确定的,那你每次运行到这里tt都会是相同的值。
要生成真正的随机数,必须有一个真正的随机数据源。比如开机后用户第一次按键的时间,就可以拿来做种子。另外,像外部晶振启动时间也是随机的,但这个值可能波动不大。
你前面提到的“接受到某个特定信号后”,这个信号到来的时间是否是随机的,如果是,就可用第一个信号到来时的定时器值作为种子。
morrisk 发表于 2014-10-13 19:52 | 显示全部楼层
开一个AD采集,就能产生随机数
kangzj 发表于 2014-10-13 19:52 | 显示全部楼层
u32 i;
i不就是随机数?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

885

主题

11314

帖子

5

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