C语言rand函数产生随机数详解

  • 1.rand函数的原型,功能和界限
  • 2.用rand函数获取随机数
  • 3.随机数生成原理

1.rand函数的原型,功能和界限

rand函数的原型:

#include <stdlib.h>int rand(void);

rand函数的功能: 用来产生一个随机数

rand函数的界限: stdlib.h头文件中有宏#define RAND_MAX 0x7fff,这表示rand产生一个0-0x7fff的随机数,即最大是32767的一个数

2.用rand函数获取随机数

rand函数获取随机数的基础用法为:

rand()%a;

a是一个整数,返回值为0到a的随机数,包含0,但不包含a。

如果想要产生一个0-99之间的随机数,那么用法如下:

int num = rand() % 100;

如果想要产生一个1-100之间的随机数,那么用法如下:

int num = rand() % 100 + 1;

同理,如果想要产生一个1-60之间的随机数,那么用法如下:

 int num = rand() % 60 + 1;//产生一个1-60之间的数

从上面的例子中我们可以推理出m-----n的随机数:

rand()%(n-m+1) + m;

比如获取15~43的随机数:

rand()%29+15;

获取小数:
我们只需要将返回值除以10或者其他合适的数,并且在输出时保留若干位小数就可以获取随机小数。

这里一定要用10.0,不能用整型。

3.随机数生成原理

我们先来看看下面这段代码,反复运行该段代码,我们会发现每次产生的随机数的值都是相同的。

#include<stdio.h>
#include<stdlib.h>int main()
{int ch = rand();printf("%d\n", ch);return 0;
}

这是因为rand函数产生的随机数是伪随机数,它除了被a的值控制外,还被一个隐藏的全局变量seed控制。它实际上是根据a和一个种子按照某个公式推算出来的。

在调用rand函数之前,会先查询是否主动调用过srand(seed)来为伪随机数生成器设定种子,如果有,那么就按照我们的代码设定种子,即初始化seed的起始值,若没有调用srand(seed),那么系统会自动给seed赋初始值,即自动调用srand(1)一次,也就是将seed的值设置为1。如果每次调用rand函数时,种子相同,那么根据公式产生的伪随机数将是相同的。

上面那段代码因为每次运行程序你都没有主动调用srand函数给seed赋值,因此每次都会默认调用srand(1),将seed的值赋值为1,也就是每次seed的值都相同,所以产生的伪随机数不会发生变化。

所以为了让每次产生的随机数不相同,那么我们就需要让每次调用rand函数之前设定的种子不相同,我们可以使用系统时间作种子srand(time(NULL);由于每次运行程序的时间肯定不相同,那么每次设定的种子也就不相同,那么产生的随机数肯定也就不一样了。

srand函数的原型:

#include<stdlib.h>
void srand( unsigned int seed );

我们使用time函数来获取系统时间,time函数的原型如下:

#include<time.h>
time_t time(time_t *tloc);//time_t类型被定义为一个长整型

使用time函数得到的值是一个时间戳,即从1970年1月1日0点到现在时间的秒数,然后将得到的time_t类型数据转化为(unsigned int)的数,再传给srand函数,用法如下:

int main()
{srand((unsigned int)time(NULL));int ch = rand();printf("%d\n", ch);return 0;
}

添加了srand((unsigned int)time(NULL));之后,当你再次运行该段代码时,你就会发现,每次生成的随机数就不同了。

如果仍然觉得时间间隔太小,可以在(unsigned int)time(0)或者(unsigned int)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned int)time(NULL)*10),time的参数传NULL表示不需要经过参数得到time_t数据。

还有另外一种初始化种子的方式如下,用进程的pid作为种子值seed,在同一个程序中,这样的种子的值是相同的。

srand((unsigned int)getpid());

C语言rand()函数产生随机数详解相关推荐

  1. c语言rand函数的作用,详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的ran ...

  2. 784-C语言rand和srand用法详解

    C语言rand和srand用法详解 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头 ...

  3. php函数find的用法,c语言find函数的用法详解

    c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...

  4. c语言memset函数用法,C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s, int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一 ...

  5. c语言memset函数作用,C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s,int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般 ...

  6. c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解

    在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...

  7. c语言连续生成不同随机数_C语言随机数生成教程,C语言rand和srand用法详解

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 头文件中的 rand() 函数来生成随机数,它的用法为: int ran ...

  8. 【C语言】C语言随机数生成教程,C语言rand和srand用法详解

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...

  9. 计算机科学类专升本复习之“C语言fopen函数的用法”详解(初稿)

    C语言fopen函数的用法,C语言打开文件详解 在C语言中,"操作文件" 之前 必须 先"打开文件"; 所谓"打开文件",就是让 " ...

最新文章

  1. redis配置开机启动
  2. 从农场女孩到首位图灵奖女性获得者,回顾法兰西斯·艾伦的辉煌一生
  3. 光滑粒子流体动力学_基于SPH(光滑粒子流体动力学)算法的流体仿真
  4. 一个视觉交互设计失败的案例
  5. java连接navicat_如何使用Navicat连接Oracle
  6. MySQL中 slave_compressed_protocol=ON 的压缩效果实验
  7. 计算机和机械交叉学科会议期刊,机器视觉相关的研究团队
  8. 客户管理系统代码项目_低代码案例:快速交付包含门店销售终端的SCM供应链管理系统...
  9. bandicam——轻松录屏
  10. kindle 不能连接wifi的三个原因
  11. [Java] 用java写的植物大战僵尸辅助
  12. 激光雷达3D建模---读书笔记
  13. 2023最新自助下单彩虹云商城系统源码+免授权无后
  14. Townscaper for Mac 城市建造模拟
  15. SSH安全策略–指定IP登陆
  16. Datadome 最新逆向分析(支持爱马仕)
  17. 西北工业大学 计算机学院 姜,姜学锋(计算机学院)老师 - 西北工业大学 - 院校大全...
  18. Windows 10 更新遇到错误代码 0x80240034 的解决方法
  19. gurobi证书过期了怎么办
  20. 【VRP】基于matlab模拟退火算法求解单中心多车辆路径规划问题【含Matlab源码 1072期】

热门文章

  1. MySQL,3306端口,内部敏感服务对外开放存在风险解决办法
  2. 7-166 图像过滤
  3. 端到端流程打通企业经脉
  4. 如何基于python实现pdf编辑器
  5. 使用JAVA输入一个整数,输出整数的阶乘
  6. pos系统开发步骤3-销售业务的实现
  7. 即刻APP 产品分析和一点感悟
  8. uniapp - 全平台兼容的 “多图上传“ 功能,搭配 uview 组件库中的 upload 上传组件(附带详细的示例源码及注释,可直接复制使用或简单修改)
  9. 广元市贫困县第一书记
  10. SKU 与 SPU 以及数据库表设计