打印

产生随机数

[复制链接]
654|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangpe|  楼主 | 2020-11-16 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

看了很多帖子,说用用srand产生种子,然后rand()产生随机数
但是种子必须每次不一样的
C语言中time.h可以产生种子:srand((unsigned int)time(NULL))

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

请教高手如何产生随机数呢?

使用特权

评论回复
沙发
wangzsa| | 2020-11-16 20:19 | 只看该作者
我之前产生随机数的方法是利用timer计数值做的

使用特权

评论回复
板凳
zhanglli| | 2020-11-16 20:25 | 只看该作者

真正的随机数要用专门的硬件随机数发生器

使用特权

评论回复
地板
wangpe|  楼主 | 2020-11-16 20:29 | 只看该作者
我只要产生一个伪随机数  怎么产生呢?

使用特权

评论回复
5
yufe| | 2020-11-16 20:33 | 只看该作者
伪随机数用rand和srand,具体用法可以查看相关帮助文档

使用特权

评论回复
6
wangpe|  楼主 | 2020-11-16 20:40 | 只看该作者
用其他软件产生不行吗

使用特权

评论回复
7
wangzsa| | 2020-11-16 20:44 | 只看该作者
需要一个存储种子的介质比如EEPROM或flash等,每次读出种子去rand用的同时把种子按照某个原则给修改下

使用特权

评论回复
8
wangpe|  楼主 | 2020-11-16 20:47 | 只看该作者
能详细点吗,我设想是这样的:接受到某个特定信号后,单片机随机延时一段时间,然后做出回应,问题就出在如何随机延时?

使用特权

评论回复
9
wangpe|  楼主 | 2020-11-16 20:55 | 只看该作者
srand获取种子的时候从哪里获取呢?  这是让我头疼的一个问题

使用特权

评论回复
10
lium| | 2020-11-16 20:59 | 只看该作者
将timer 打开,需要种子的时候读timer的值,按照某个方法++--*%后作为种子用

使用特权

评论回复
11
wangpe|  楼主 | 2020-11-16 21:02 | 只看该作者
#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);
.
.
.
.
.
}


这样可以吗?

使用特权

评论回复
12
guoyt| | 2020-11-16 21:09 | 只看该作者
我是将每次生成的随机数存入EEPROM,下次初始化Srand时读EEPROM的值作为种子,能保证每次开机不出同样的随机数。

使用特权

评论回复
13
wangpe|  楼主 | 2020-11-16 21:15 | 只看该作者

#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);
                   ...
}

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

使用特权

评论回复
14
llia| | 2020-11-16 21:22 | 只看该作者
还行

使用特权

评论回复
15
langgq| | 2020-11-16 21:25 | 只看该作者
用IC卡就可以产生不错的随机数。

使用特权

评论回复
16
zhuww| | 2020-11-16 21:29 | 只看该作者
在while(1)中,搞一个变量累加,也可当作伪随机数

使用特权

评论回复
17
lium| | 2020-11-16 21:32 | 只看该作者
如果有rtc,用rtc的时间做种子应该可以的

使用特权

评论回复
18
hanwe| | 2020-11-16 21:38 | 只看该作者

打开定时器,随时读定时器的值,相当于随机了。定时器16位的话只读后八位,或者后四位,变化很快的。程序随便一跑,就相当于随机发生器了。

使用特权

评论回复
19
llia| | 2020-11-16 21:42 | 只看该作者
IC卡里有真随机数发生器

使用特权

评论回复
20
wangzsa| | 2020-11-16 21:46 | 只看该作者

1.打开定时器,抽取计数值
2.维护一个变量,以一定频率一定算法更新值

使用特权

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

本版积分规则

938

主题

9837

帖子

2

粉丝