c语言 伪随机数程序,C语言的伪随机数
一直想好好的系统的学习一下C语言的伪随机数,今天终于逮到机会了
伪随机数
C语言中有可以产生随机数据的函数,需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。
先来介绍一下srand
头文件:
定义函数:void srand (unsigned int seed);
函数说明:srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用getpid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
再来介绍一下time,
函数名称: time
函数原型: time_t time(time_t *timer)
函数功能: 得到机器的日历时间或者设置日历时间
函数返回: 机器日历时间
参数说明: timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型
所属文件:
因此上述的srand((unsigned)time(NULL))是利用系统时间来初始化随机种子的。
最后来介绍一下重要的一个函数rand
rand函数
头文件:
定义函数:int rand(void)
函数功能:产生随机数
函数说明:因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以,在一定的范围里可看成是随机的。rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
返回值: 返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。且0-RAND_MAX每个数字被选中的机率是相同的。
rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
举个例子
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",rand());
}
return 0;
}
说白了上述的随机数范围是0~32767之间,若没有设置系统时间种子,则rand默认随机种子为1,则多次运行结果都是一致的。
当然,若想要一个给定范围的随机数,则需要使用rand()%(b-a+1)+a。显然rand()%(b-a+1)的范围是[0,b-a],再加上a即为[a,b]。
举个例子([0,1]和[3,6]之间的随机数)
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",rand()%2);
}
putchar('\n') ;
for(int i=0;i<10;i++){
printf("%d ",rand()%4+3);
}
return 0;
}
一般来说这个范围最大是0~32767,若想要生成超过32767的更大的随机数,则可以采用,移位或者拼凑或者用随机数除以RAND_MAX,这样就会得到一个[0,1]范围内的浮点数。只需要这个浮点数乘以范围长度(b-a+1)再加上a即可。即(int)((double)rand()/32767*(b-a+1)+a),相当于这个浮点数在[a,b]范围内的比例位置
举个例子
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",(int)((1.0*rand()/RAND_MAX*50000+10000)));//10000~60000
}
return 0;
}
PS:介绍一个简单的AC技巧,在程序中一次性计算出所有需要用到的结果,然后查询直接取这些结果,典型的AC技巧有木有(●ˇ∀ˇ●)
小结
C语言的伪随机数适用范围还是挺广泛的,下次需要用起来的时候,就不需要再去找什么资料了。
c语言 伪随机数程序,C语言的伪随机数相关推荐
- c语言名字程序,c语言获得程序位数和操作系统位数和名称
// vcis64.cpp : VC 64位程序开发心的--c语言获得程序位数和操作系统位数和名称. #include #include #include #include // 获取程序位数(被编译 ...
- 常用c语言小程序,c语言经典小程序汇总大全
网上有很多的人说编程有多么多么无聊,其实:不要管别人怎么说,别人说什么,做你自己喜欢做的事就好.坚持下来,你会发现编程的乐趣的.当然,如果你觉得学习编程语言很痛苦,坚持了一段时间后无果,南无果断放弃未 ...
- c语言小程序作业,c语言小程序(c语言简单小程序代码)
所以特此求经典C语言小程序.谢谢大家的关注!!! #include #include void function(int n){ int i,j,k,x=0; for(i=1;i<=n;i++) ...
- c语言实验程序,C语言实验程序
<C语言实验程序>由会员分享,可在线阅读,更多相关<C语言实验程序(11页珍藏版)>请在人人文库网上搜索. 1.P113:6 #include void main() floa ...
- c语言编号程序,c语言中如何在一个程序语句前加编号c语言中如何在一个程序语句前加...
多数情况下,现在的编程高手都是从学习C 语言入门的,在学校里,计算机相关专业中最基础的课程也包括C 语言,因此,掌握好这门课程对每一位立志成为优秀程序员的初学者来说是大有裨益的!另外,对想通过参加全国 ...
- c语言文件发送程序,C语言程序例程的文件结构
以往写C语言程序都是一个文件里面写个几十.几百行,在练算法的时候还可以,现在搞开发需要模块化编程,所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一 ...
- C语言,后门程序,C语言CGI编程二 - 编写cmd后门
里面该说的都说的很清楚.今天我们来用它来做一个后门,将后门放在有执行cgi权限的服务器上,通过客户端POST命令到cgi上并执行,达到控制服务器的目的. 首先下载官网上的压缩包.解压里面有cgic.c ...
- 物资管理系统c语言运行程序,C语言实现仓库物资管理系统.pdf
C语语言言实实现现仓仓库库物物资资管管理理系系统统 前前言言 此系统为博主大一上学期C语言课程设计的大作业,由 当时初步接触C语言,现在来看程序写的太烂了,简直不忍直视--但是 还是想通过博客的形式记 ...
- 水泵调速c语言实验程序,C语言实验最原始.doc
<C语言程序设计>实验报告 三亚学院理工分院 学号 1310750029 姓名: 边春晖 专业 软件1301 实验时间 2014年5 月23 日 节次 实验室名称 设备号 实验内容: 编写 ...
最新文章
- 面向对象——构造方法(重载)
- QT的QDeadlineTimer类的使用
- sscanf的常见用法
- Python基础之window常见操作
- 中文VS2008安装ASP.NET MVC框架解决方案
- redis的简易安装
- 大数据“矿工” 世界上最艰辛的IT人
- docker export/import到docker容器迁移的思考
- Win10 专业版激活!
- 英语听力软件测试自学,每日英语听力应该怎么学习?
- 包学会之浅入浅出Vue.js:升学篇
- HardFault错误信息分析定位
- 理工科科研结果展示怎样让PPT高大上?
- 自我拷贝数的C语言编码,“数学黑洞——自我拷贝数”有哪些?
- html银白色,纯CSS打造银色MacBookAir(二)_html/css_WEB-ITnose
- Java设计原则之单一职责原则、开闭原则、里氏代换原则
- python 12306登录_Python 12306登陆详细分析及操作
- Lucene 搜索词分词
- (优雅解决)如何安全地关闭Intel的RST(快速存储)技术
- 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,
热门文章
- “裸辞”真的就会没前途吗?面对他你是会 “雪上加霜“,还是“绝处逢生“?
- 我用HTML写的新学期课程表
- 安泰测试Agitek-TH2826型 LCR数字电桥
- 《C++ Primer Plus》第17章:输入、输出和文件(2)
- Android framework学习
- Microsoft Advanced Threat Analytics
- TLS、SSL原理解析
- tinyxml2存储xml数据简单高效
- 科技创新变革全新趋势
- postgresql 序列Sequence