产生随机数(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 ...
随机推荐
- TestStand 基础知识[6]--Build-in Step Types (1)
Step Types 有TestStand自带的,也有自定义的.本文先介绍自带的Step Types. 首先什么是Step Types ? 翻译过来就是步骤的类型,类似数据类型--数据有整型,字符串, ...
- Go语言实现:【剑指offer】二叉搜索树的后序遍历序列
该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. Go ...
- 11--Java--JDBC知识梳理
JDBC 一.概述:JDBC(java database connection),使用java语言连接数据库,是java提供一套操作数据库的接口(标准),实现对数据库的统一访问,是一个java引用应用 ...
- 一次修改数据库物理文件造成Mysql宕机的恢复记录
事件起始 某夜,我正在床上冥想准备入睡,忽然同事向我求救:消息内容如下: Oh My Gold 改了些配置,啥都没了!都没了!没了!了! 我仔细询问,原来是她因为某些原因将某库的物理文件夹改名后,发现 ...
- FFmpeg命令读取RTMP流如何设置超时时间
子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题0x001: 前言 今天在测试程序时遇到两个问题.Q1:ffmpeg录制RTMP流并 ...
- 微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)
微信小程序仿朋友圈功能开发(发布.点赞.评论等功能) 1.项目分析 项目整体分为三个部分 发布 展示 详情页 graph LR 朋友圈发布 --内容发布--> 内容展示 内容展示 --点击展示卡 ...
- Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List
条件去重 我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如: List<Integer> nu ...
- JS从键盘输入当月利润,求应发放奖金总数
题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%:20万到4 ...
- Ubuntu18.04-Java8安装
添加ppa sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 安装oracle-java-installer sudo ...
- Android中Chronometer计时器的简单使用
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...