C语言如何生成随机数以及设置随机数的范围。(超详细)

ops/2024/10/20 13:41:31/

文章目录

  • 前言
  • 一、随机数的生成
    • 1.rand函数
    • 2.srand函数
    • 3.time函数
    • 4.生成随机数的代码如下:
  • 二、设置随机数的范围
  • 总结


前言

博主将会这篇文章介绍c语言如何生成随机数以及设置随机数的范围。创作不易请大家点点赞,点点关注。


一、随机数的生成

1.rand函数

C语言提供了⼀个函数叫 rand,这函数是可以生成随机数的,函数原型如下所示:

1 int rand (void);

  1. rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。
  2. rand函数的使用需要包含⼀个头文件是:stdlib.h

那我们可以测试⼀下rand函数,这里多调用几次,产生5个随机数:

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

我们可以多运行几次,可以发现:
在这里插入图片描述
在这里插入图片描述

  1. 我们会发现一次运行中产生的5个数字是相对随机的,下一次运行程序生成的结果会和上一次一模⼀样。

  2. 如果再深入了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随数,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“种子”的基准值进行运算生成的随机数。

  3. 之所以前面每次运行程序产生物的随机数序列是⼀样的,那是因为rand函数生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。


2.srand函数

C语言中又提供了⼀个函数叫 srand,用来初始化随机数的生成器的,srand的原型如下:

void srand (unsigned int seed);

  1. 程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
  2. 那也就是说给srand的种子是如果是随机的,rand就能生成随机数;在生成随机种子的时候又需要⼀个随机数,这就矛盾了。

3.time函数

在程序中我们⼀般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。 在C语言中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:

time_t time (time_t* timer);

  1. time
    函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
  2. time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
  3. 如果timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
  4. time函数的时候需要包含头文件:time.h
  5. 如果只是让time函数返回时间戳,我们就可以这样写:

time(NULL);//调用time函数返回时间戳,这里没有接收返回值


4.生成随机数的代码如下:

那样我们就能把随机数的代码改写成下面这样:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{//使⽤time函数的返回值设置种⼦//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}

多运行几次,会发现每次的结果就会有所差异。
在这里插入图片描述

在这里插入图片描述
而且srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。


二、设置随机数的范围

如果我们要生成0~99之间的随机数,方法如下:

rand() %100;
余数的范围是0~99

如果要生成1~100之间的随机数,方法如下:

rand()%100+1;
%100的余数是0~ 99,0~ 99的数字+1,范围是1~100

同理可得要生成100~200的随机数,方法如下:

100 + rand()%(200-100+1)
余数的范围是0~ 100,加100后就是100~200

综上所述,生成a~b范围的公式为:

a + rand()%(b-a+1)

随机数实战用法—C语言扫雷游戏:http://t.csdnimg.cn/MHZxs


总结

本文主要介绍了rand函数、srand函数、以及time函数和时间戳的概念和如何控制随机数的范围。下一篇文章将介绍利用随机数和循环来写一个猜数字游戏。新人博主创作不易,希望大家动动小手点点赞和关注。


http://www.ppmy.cn/ops/87614.html

相关文章

基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)

文章目录 一、前言二、搭建开发环境三、网络编程基础概念科普3.1 什么是网络编程3.2 TCP 和 UDP协议介绍3.3 TCP通信的实现过程 四、Windows下的网络编程相关API介绍4.1 常用的函数介绍4.2 函数参数介绍4.3 编写代码体验网络编程 五、访问华为云IOT服务器创建一个产品和设备5.2…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造 和 用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityope…

NodeJS版本管理可视化工具无繁琐配置支持所有系统-NodeJS安装和环境配置(超详细超简单)

目录 1. 简介2. 下载3. 安装4. 功能介绍4.1 主页面介绍4.2 设置介绍4.1.1 检查更新4.1.2 主题颜色4.1.3 提示4.1.4 配置导入导出4.1.5 基础设置 4.3 已安装界面介绍4.4 项目界面介绍4.5 分组 5. MacOS提示应用已损坏问题 1. 简介 有了这个工具&#xff0c;你再也不用去设置哪些…

【Java数据结构】线性表之栈和队列

栈&#xff08;Stack&#xff09; 简单描述 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&…

【C++】关联容器探秘:Map与Multimap详解

目录 1.映射类 map 0. 引入 pair&#xff1a; 1.定义 2.插入 3. 遍历 4.❗operator[]的实现 5. 插入 运用 2.Multimap 类 0. 引入&#xff1a;不去重的 Multi 1. Multimap 不支持 Operator[] 2. Multimap 的删除 1.映射类 map 0. 引入 pair&#xff1a; 在C中&…

启动pip或ipython提示Fatal error in launcher: Unable to create process的解决方法

错误以及原因分析 有时&#xff0c;运行python的pip或ipython组件会报错&#xff1a; Fatal error in launcher: Unable to create process using "C:\third_party\Python\3.9\win64-msvc-14.2\python.exe" 错误信息最后这一串路径在我们的电脑上很可能并不存在&…

Python从0到100(四十):Web开发简介-从前端到后端(文末免费送书)

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒&#xff0c;杯莫停&#xff01; 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批&#xff0c;当然要尝试爬取王者荣耀的东西啦。 将进…