产生随机数(rand()函数和srand()函数)
有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数。
函数原型:int rand(void);
功能:返回一个[0,RAND_MAX]间的随机整数。其中RAND_MAX是定义在stdlib.h头文件中的一个常量。
注意: rand()函数包含在头文件stdlib.h中,要使用它必须用#include<stdlib.h>引入该头文件;
计算机实际上并没有真正做到产生一个随机数,只是在一串预先定义好的数据中选择一个返回给函数。
那么,如何得到一个在a到b的整数呢?有两种方法:
法一:
公式:a+rand()%(b-a+1)
示例:
n=1000+rand()%9000;//随机生成一个四位数返回给n。a+rand()%(b-a+1),四位数即1000-9999,此时a=1000,b=9999
法二:
公式:a+rand()*(b-a+1)/RAND_MAX
示例:
n=+rand()*/RAND_MAX;//随机生成一个四位数返回给n。a+rand()*(b-a+1)/RAND_MAX,四位数即1000-9999,此时a=1000,b=9999
当要产生多个随机数时,rand()会重复调用产生相同的数字序列。如果想要每次执行产生的随机数不同,就需要进行随机初始化。因此引入srand()函数。
函数原型:void srand(unsigned seed);
功能:根据随机数生成器的种子seed的值初始化随机数。
我们当然可以用数组和循环来设置种子的值,那么有没有什么我们可以直接利用的一直变化的值呢?
当然有,时间就是。我们可以借助time.h头文件中的time(NULL)返回机器当前的时间。
函数原型:time_t time(time_t *t)
功能:返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间。当参数为空指针NULL时,返回到当前机器时间的秒数,精度为长整型ld。
注意:要使用time()函数,先要通过#include<time.h>引入time.h头文件。
示例:
#include <stdio.h>
#include <time.h> int main ()
{
time_t seconds; seconds = time(NULL);
printf("自 1970-01-01 起的小时数 = %ld\n", seconds/); return();
}
现在,将time(NULL)作为srand()函数的随机数产生器种子,即srand(time(NULL))就可以通过不断变化的系统时间得到不同的随机数。
示例:
问题描述:
随机产生一个四位数,同时给出各位数字和。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
while()
{
int n,a,b,c,d,s;
srand(time(NULL));
// n=1000+rand()%9000;//a+rand()%(b-a+1),四位数1000-9999,a=1000,b=9999
n=+rand()*/RAND_MAX;
a=n/;
b=n%/;
c=n%/;
d=n%;
s=a+b+c+d;
printf("%d\n",n);
printf("s=%d\n",s);
getchar();
}
return ;
}
运行结果:

可以看出,我们成功得到了随机的四位数。
拓展问题:
1.为什么还会产生连续的相同的随机数?
答:键盘按太快了,函数读取系统时间有一定的延迟,是以秒为单位的,在1秒内按下的多个输入均视为相同时间,随机种子数不变,所以产生了相同的数。
2.1970年到现在已经过去了n秒,n是一个很大的数,是不是比rand()函数参数取的最大值RAND_MAX还大?会不会因为溢出而产生错误?
答:不会。在VC6中,RAND_MAX值是0x7fff,n确实比RAND_MAX大的多,即使n小于RAND_MAX,在未来也必然会有超过RAND_MAX的时刻。此时的随机种子数seed=n mod RAND_MAX,即按RAND_MAX长度为一个周期,取余数赋值给随机种子数seed。
产生随机数(rand()函数和srand()函数)的更多相关文章
- RAND函数和SRAND函数
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...
- (转)rand函数和srand函数
转:http://www.cnblogs.com/lenient/articles/1565376.html 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand ...
- C/C++随机数rand()和种子函数srand()
在计算机编程中,常常要产生一个随机数.但是要让计算机产生一个随机数并不那么容易.计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数.只可能以一定的算法产生一个伪 ...
- 【C++】随机数,rand()与srand()函数
rand()函数 rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 测试代码: #include<cstdl ...
- 关于rand()与srand()函数
rand函数功能为获取一个伪随机数(伪随机数的概念下面会有介绍). 一.函数名: rand(); 二.声明: int rand(); 三.所在头文件: stdlib.h 四.功能: 返回一个伪随机数. ...
- C语言中生产随机数 rand()函数
参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...
- sql server 生成随机数 rand函数
https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql?view=sql-server-2017 在某一个区间内生 ...
- C/C++中产生随机数(rand,srand用法)
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...
- C++随机数rand(), srand()
c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib ...
随机推荐
- 一、Mongodb安装和配置
简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品. Mongod ...
- RabbitMQ安装与使用
官网地址: http://www.rabbitmq.com/ 安装Linux必要依赖包 下载RabbitMQ必须安装包 进行安装,修改相关配置文件即可 步骤 1.准备: yum install gcc ...
- Trie(字典树)的侃侃
Trie是什么 ? 字典树 : 见名知意(在树上进行查询). 跟字典相关的必定与查询有密切的关系, 查询就需要一定的媒介作为支撑,树就为这种查询提供支撑. Trie做什么 ? 实现字符串快速检索的多叉 ...
- Netty学习(2):IO模型之NIO初探
NIO 概述 前面说到 BIO 有着创建线程多,阻塞 CPU 等问题,因此为解决 BIO 的问题,NIO 作为同步非阻塞 IO模型,随 JDK1.4 而出生了. 在前面我们反复说过4个概念:同步.异步 ...
- Nginx总结(八)Nginx服务器的日志管理及配置
前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...
- 我一个二本大学是如何校招拿到阿里offer的
作者:薛勤,互联网从业者,编程爱好者. 本文首发自公众号:代码艺术(ID:onblog)未经许可,不可转载 01:终于步入大学 我既没有跨过山和大海,也没有穿过人山人海,我就是我,一个普通本科大学生. ...
- python新手如何编写一个猜数字小游戏
此文章只针对新手,希望大家勿喷,感谢!话不多说先上代码: import random if __name__ == '__main__': yourname = input("你好! 你的名 ...
- Linux内存管理解析(二) : 关于Linux内存管理的大体框架
什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...
- Maven jar包冲突
在pom.xml中引入一个依赖,maven会自动导入这个依赖的依赖,方便的同时也会造成jar包冲突: (1)A.B都依赖C,我们导入A(自动导入C).B(自动导入C),maven自动导入了2个C,到底 ...
- NFS服务配置 Linux
两台机器: NFS服务器:192.168.1.100 (我的是Ubuntu系统) 客户机:192.168.1.123 (保证两台机器互相可以ping通) 需求:在NFS服务器上创建一个共享文件夹/ho ...