【C语言】随机数生成详解,手把手教你,保姆级!!!

目录

rand函数

srand函数

time函数

设置随机数范围

拓展--猜数字游戏

总结


rand函数

C语⾔提供了⼀个函数叫 rand,这函数是可以⽣成随机数的,函数原型如下所⽰

int rand (void);

rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767

那我们就测试⼀下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;
}

我们先运⾏⼀次,看看结果,再运⾏⼀次再看看结果,多运⾏⼏次呢?

我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次 ⼀模⼀样,这就说明有点问题

如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正 的随机数,是通过某种算法⽣成的随机数。

真正的随机数的是⽆法预测下⼀个值是多少的。

⽽rand函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。 之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。

如果要⽣成不同的随机数,就要让种⼦是变化的

srand函数

C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的,srand的原型如下

 void srand (unsigned int seed);

在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了

就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数,⽣成随机数的时候⼜需要⼀个随机数,这显然不合理;

time函数

我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。 在C语⾔中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下

typt_t time (typt_t* timer)

time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的;

time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。 如果 timer 是NULL,就只返回这个时间的差值。

time函数返回的这个时间差也被叫做:时间戳。 time函数的时候需要包含头⽂件:time.h

如果只是让time函数返回时间戳,我们就可以这样写:

time(NULL);

那我们就可以让⽣成随机数的代码改写成如下

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

如果要⽣成a~b的随机数

a + rand()%(b-a+1) //这个公式要牢记!!!

拓展--猜数字游戏

代码:

#include <stdio.h>
void meau()
{printf("    猜数字游戏\n");printf("******************\n");printf("*** 1.开始游戏 ***\n");printf("*** 0.退出游戏 ***\n");printf("******************\n");
}void game()
{srand((unsigned int)time(NULL));int r = rand() % 100 + 1;int m;int a = 5;printf("    游戏开始\n");while (1){printf("你还有%d次机会\n", a);printf("请输入一个数字:>");scanf("%d", &m);if (m > r)printf("你猜的数字大了\n");else if(m < r)printf("你猜的数字小了\n");else{printf("恭喜你,猜对了。\n随机数为%d\n请继续:\n", r);break;}a--;if (a == 0){printf("很遗憾,你的次数已用完,随机数为%d.请在次挑战!\n", r);break;}}
}
int main()
{int n = 0;do {meau();printf("请输入指定数字:>");scanf("%d", &n);switch (n){case 1:game();break;case 0:break;default:printf("错误输入,请重新按规则输入\n");break;}} while (n);return 0;
}

这里就不一一解释了,不理解可以看我之前的博客

猜数字小游戏:http://t.csdnimg.cn/mqnZz

总结

关于随机数的内容基本就结束了,具体还需要宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

M个苹果放入N个盘子(递归)

题目&#xff1a; 把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法&#xff09; 输入 每个用例包含二个整数M和N。…

【golang】go执行shell命令行的方法( exec.Command )

所需包: import "os/exec" cmd的用法: cmd : exec.Command("ls", "-lah") //ls是命令,后面是参数 e : cmd.Run() 多个参数的要分开传入: 如:ip link show bond0 cmd :exec.Command("ip","link","show","…

Linux(操作系统)面经——part 1(持续更新中......)

1、说一说常用的 Linux 命令 mkdir创建文件夹&#xff0c;touch创建文件&#xff0c;mv移动文件内容或改名 rm-r 文件名&#xff1a;删除文件 cp拷贝&#xff1a;cp 文件1 文件2&#xff0c;cp-r跨目录拷贝 cp-r 路径1 路径2 vi 插入 &#xff1a;wqb保存退出 :q!强制退出…

【Axure教程】区间评分条

区间评分条是一种图形化的表示工具&#xff0c;用于展示某一范围内的数值或分数&#xff0c;并将其划分成不同的区间。这种评分条通常用于直观地显示数据的分布或某个指标的表现。常用于产品评价、调查和反馈、学术评价、健康评估、绩效评估、满意度调查等场景。 所以今天作者…

DOM树和DOM对象与JS关系的深入研究

const和let使用说明 var不好用&#xff0c;我们如果用变量都是用let&#xff0c;如果用常量乃是不变的量&#xff0c;我们用const&#xff0c;见let const知变量是否可变。比如一个常量在整个程序不会变&#xff0c;但是你用let&#xff0c;是可以的。但是let最好与内部变量改…

SSH连接服务器后执行多条命令

SSH连接服务器后执行多条命令 大家平时有没有遇到自己连接云服务器&#xff0c;ssh 连接上去之后&#xff0c;发现自己的一些小工具用不了 例如go build无法使用 &#xff0c;由于我们安装配置golang 环境的时候&#xff0c;是在文件/etc/profile中写了配置&#xff0c;因此需…

《洛谷深入浅出进阶篇》简单数据结构

本篇文章内容如下&#xff0c;请耐心观看&#xff0c;将持续更新。 简单数组 简单栈 简单队列 简单链表 简单二叉树 简单集合 图的基本概念 二叉堆 线段树 树状数组与字典树 线段树进阶 简单数组&#xff1a; STL可变数组 vector " 我们首先要知道这个容器有什…

Java多线程编程学习

1 线程的概念 多线程是指同一个程序同时存在多个“执行体”&#xff0c;它们可以同时工作 1.1 进程的概念 一次程序的每一次运行都叫做进程&#xff08;一个进程可以包含多个线程 1.2 线程的概念 多线程是指一个程序中多段代码同时并发进行 1.3 主线程的概念 JavaMain中的线程就…

Python语言学习笔记之十(字符串处理)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 字符串处理&#xff1a;以实现字符串的分割、替换、格式化、大小写转换&#xff0c;Python字符串处理是指对Py…

人工智能知识蒸馏:模型精简与迁移的奇妙之旅

导言 在人工智能领域&#xff0c;知识蒸馏作为一种模型精简和知识迁移的技术手段&#xff0c;逐渐成为提高模型效能和适应更广泛场景的关键工具。知识蒸馏是近年来在深度学习领域备受瞩目的技术&#xff0c;其通过将大模型的知识传递给小模型&#xff0c;旨在实现模型的轻量化与…

AST反混淆进阶-return简写表达式还原

实现目的&#xff1a;return简写表达式还原,增强可读性处理前 demo.js function _0x30e2() {return a 1, b 2, c 3, d 4, a b c d; }console.log(_0x30e2());处理后 demoNew.js function _0x30e2() {a 1, b 2, c 3, d 4;return a b c d; }console.log(_0x30e2())…

【Unity】如何让Unity程序一打开就运行命令行命令

【背景】 Unity程序有时依赖于某些服务去实现一些功能,此时可能需要类似打开程序就自动运行Windows命令行命令的功能。 【方法】 using UnityEngine; using System.Diagnostics; using System.Threading.Tasks; using System.IO; using System.Text

docker-compose Install gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

交友网站的设计与实现(源码+数据库+论文+开题报告+说明文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

DDD系列 - 第7讲 仓库Repository - JPA篇(一)

目录 一、关于ORM & JPA & Hibernate & Spring Data JPA二、领域层定义领域模型和JPA映射2.1 设计聚合2.2 JPA映射 - 实体、值对象2.3 JPA映射 - 枚举2.4 JPA映射 - 对象关系2.5 JPA映射 - 自动生成DDL书接前一篇《DDD系列 - 第6讲 仓库Repository - Mybatis篇》,…

TSINGSEE青犀基于opencv的安全帽/反光衣/工作服AI检测算法自动识别及应用

安全帽/反光衣/工作服自动识别检测算法可以通过opencvyolo网络对现场画面中人员穿戴着装进行实时分析检测&#xff0c;判断人员是否穿着反光衣/安全帽。在应用场景中&#xff0c;安全帽/反光衣/工作服检测应用十分重要&#xff0c;通过对人员的规范着装进行实时监测与预警&…

CloudFlare 优选ip 和 优选域名的获取方法

1.CloudFlare优选IP网站:【链接直达】 2.CloudFlare 优选IP工具&#xff1a;【开源软件】 3.CloudFlare 优选域名&#xff1a;【GitHub开源工具】 4.CF优选域名推荐&#xff1a; time.cloudflare.com shopify.com time.is icook.hk icook.tw ip.sb japan.com malaysia.com rus…

嵌入式linux开发——stm32mp1完成视觉检测(一)

这里从今天开始给自己挖坑然后慢慢填坑…… 打算基于自己买的正点原子的stm32mp157开发板还有OV5640摄像头&#xff0c;完成一个视觉检测的项目&#xff0c;最基础的版本是直接OpenCV打开摄像头然后完成简单的检测&#xff1b;进阶版把sklearn训练的模型通过cpp读取然后显示&a…

YOLOV8:最新探测物体状态综合指南

YLOLV8是最新的以YOO为基础的物体检测模型,提供最先进的性能。 利用前几部《yolo》,yolov8更快速更准确&#xff0c;同时为训练模式提供统一的框架 物体检测实例分割影像分类 到编写本文件时,许多功能还没有被添加到超催化剂YLOLV8存储库中。这包括训练有素的模型的一整套导…

Axure元件的介绍使用以及登录界面和个人简历的绘制

目录 一、Axure元件介绍 1.1 简介 1.2 特点 1.3 元件操作 二、基本元件的使用 2.1 矩形和圆形 2.2 图片 2.2.1 图片元件特点 2.2.2 具体操作 2.3 占位符 2.3.1 使用规范方法举例 2.4 文本元件 2.4.1 图示 2.5 热区 2.5.1 图示 2.5.2 热区辅助页面排版 2.6 线段…