有时候,我们需要随机产生一个在某范围的数,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()函数)的更多相关文章

  1. RAND函数和SRAND函数

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...

  2. (转)rand函数和srand函数

    转:http://www.cnblogs.com/lenient/articles/1565376.html 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand ...

  3. C/C++随机数rand()和种子函数srand()

    在计算机编程中,常常要产生一个随机数.但是要让计算机产生一个随机数并不那么容易.计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数.只可能以一定的算法产生一个伪 ...

  4. 【C++】随机数,rand()与srand()函数

    rand()函数 rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 测试代码: #include<cstdl ...

  5. 关于rand()与srand()函数

    rand函数功能为获取一个伪随机数(伪随机数的概念下面会有介绍). 一.函数名: rand(); 二.声明: int rand(); 三.所在头文件: stdlib.h 四.功能: 返回一个伪随机数. ...

  6. C语言中生产随机数 rand()函数

    参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...

  7. sql server 生成随机数 rand函数

    https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql?view=sql-server-2017 在某一个区间内生 ...

  8. C/C++中产生随机数(rand,srand用法)

    计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...

  9. C++随机数rand(), srand()

    c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib ...

随机推荐

  1. Scala 学习(9)之「函数式编程」

    引用透明 对相同的输入,总是能得到相同的输出. 如果 f(x) 的参数 x 和函数体都是引用透明的,那么函数 f 是纯函数. 违反引用透明的例子 我们可以很清楚的看到,对于相同的输入,第二次调用app ...

  2. 小程序云开发--内容安全审查API云调用

    云调用 云调用是小程序·云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 wx-server-sdk 使用. 接口方法 openapi.security.msgSecCheck 需在 ...

  3. Python原来这么好学-1.1节: 在windows中安装Python

    这是一本教同学们彻底学通Python的高质量学习教程,认真地学习每一章节的内容,每天只需学好一节,帮助你成为一名卓越的Python程序员: 本教程面向的是零编程基础的同学,非科班人士,以及有一定编程水 ...

  4. python如何删除二维或者三维数组/列表中某维的空元素

    如题,个人在使用python进行数据预处理过程中出现的问题,抽象成删除三维列表中某维为空的问题. 一.首先来看一下三维数组/列表的结构 仔细看下图就会很清楚了: 轴0即是去除第一个外括号后第一层(我把 ...

  5. 集智学院 “Deep X:Deep Learning with Deep Knowledge”的公开讲座---总结

    人工智能旨在了解人类智能的本质,并创造出能模仿人类智能做出反应的智能机器,目前在一些领域已经取得显著的成功,如AI玩游戏.问答系统.自动驾驶.无人机.机器人.翻译.人脸识别.语音识别等领域.深度学习的 ...

  6. Cacti 邮件 报警

    一.使用cacti发一封测试邮件   1.使用第三方SMTP 访问 到达  设置——Mail 选项 设置如下: 1处填写收件箱地址 2.处填写发件箱地址 3.处填写smtp服务器地址 4处填写发件箱用 ...

  7. git知识简单小结

    git特点: 1)分布式 2)存储快照而非差异 3)本地有完全的版本库,几乎所有操作都在本地 4)有内在的一致性,SHA1 5)优秀的分支管理 6)支持各种协同模式 7)开源,有一些第三方软件可整合使 ...

  8. Vue.js 计算属性computed和methods的区别

    在vue.js中,有methods和computed两种方式来动态当作方法来用的 如下: 两种方式在这种情况下的结果是一样的 写法上的区别是computed计算属性的方式在用属性时不用加(),而met ...

  9. c++ bool

    bool 就两个值,真或者假,通常用来存储关系表达式或者逻辑表达式的结果. 以前是用 int 来表示真假,大 int 有多个值,所以才规定 0 为假,非零为真,导致对应关系比较麻烦,有了 bool 就 ...

  10. redis教程-redis环境搭建安装(qq:1324981084)

    需要整套redis缓存高可用集群教学视频的加qq:1324981084,本套视频从安装到集群的搭建和源码的解析,从零基础讲解. 1.利用命令将redis下载到/usr/local/文件夹下: wget ...