前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言笔记】关于随机数的总结

【C语言笔记】关于随机数的总结

作者头像
正念君
发布2019-06-26 16:34:10
1.8K0
发布2019-06-26 16:34:10
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

C语言的库头文件stdlib.h中有个生成随机数的函数:

代码语言:javascript
复制
int rand(void);

该函数返回0~RAND_MAX之间的随机数,在stdlib.h中可知道,RAND_MAX0x7FFF,如:

V71CkQ.md.png
V71CkQ.md.png

但这里生成的随机数为伪随机数。所谓的伪随机数简单来说就是每次运行程序产生的随机数都是一样的。

示例程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 printf("%d\n",rand());
 return 0;
}

程序运行结果为:

V71kpn.md.png
V71kpn.md.png

程序连续运行三次,产生的由rand()函数产生的随机数都是一样的,这就是伪随机数。

那么如何才能产生真正的随机数呢?其实头文件stdlib.h里还有另一个函数:

代码语言:javascript
复制
void srand(unsigned int seed);

这个函数的作用是产生随机数种子,rand()函数会根据seed的值来产生随机数,若在这调用rand()函数之前没有调用srand进行播种,则seed的值就没变,则产生的随机数就是伪随机数。所以,只要种子seed的值改变,那么调用rand()函数产生的随机数就是真正的随机数。

示例程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 srand(1);    
 printf("%d\n",rand());
 srand(2);
 printf("%d\n",rand());
 srand(3);
 printf("%d\n",rand());
 return 0;
}

程序运行结果为:

V71n7F.md.png
V71n7F.md.png

可见,种子seed不一样,生成的随机数就不一样,即真实的随机数。

seed的值改为相同的,则产生的随机数就是伪随机数。

示例程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 srand(520);
 printf("%d\n",rand());
 srand(520);
 printf("%d\n",rand());
 srand(520);
 printf("%d\n",rand());
 return 0;
}

程序运行结果:

V71YnK.png
V71YnK.png

种子seed不变,产生的随机数就是一样的,即伪随机数。

那么,怎么才能较方便地设置随机数的种子呢?可以使用time()函数的返回值作为随机数种子,time()函数返回的是1970年1月1日至现在的秒数,每一时刻都是不一样的,即每一时刻seed的值都不一样。

接下来编写一个程序用于产生10个10以内的随机数,示例程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 int loop;
 srand((unsigned)time(NULL));
 for (loop = 0; loop < 10; loop++)
 {
   printf("%d\n",rand()%10);
 }

 return 0;
}

程序运行结果为:

V71aAe.md.png
V71aAe.md.png

除此之外,若要生成a~b之间的数字,可以使用rand()%(b-a+1)+a

以上就是关于随机数的总结,要注意srand()函数应与rand()成对使用,并且在调用rand()函数之前应先调用srand()进行播种,每次播的随机种子应该是不一样的,否则产生的随机数就是伪随机数。可用time()函数的返回值作为随机种子,这是典型做法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档