你知道如何生成随机数吗?(超详细附图)

article/2025/8/28 15:00:09

目录

😉前言

🍸如何用C语言实现随机数

🍹随机数原理

🍹rand函数(生成随机数)

🍹srand(避免每次运行程序产生的随机数都相同)

🍹时间戳

🥤time函数

🍸来个小小项目

🍸代码实现

🍹1.漂亮的主页

🍹2.游戏开关

🍹3.game()函数的代码实现。

🍹4.完整代码


手把手教你得到计算机的随机数,并附上一个小栗子。


😉前言

这两天时间允许还是日更叭,落下了不少博客没写呢,元气满满的一天,加油!多谢大家的支持,我已经500粉啦!

f33f27e3dfe04c86a55e4f0039b56bfb.gif

🍸如何用C语言实现随机数

🍹随机数原理

 计算机所产生的随机数是通过一串很长的序列数模拟随机数,故称为伪随机数,在实际应用这些随机数时,这些随机数一般都能具有真实随机数的所有概率性质和统计性质,因此可以产生许许多多的序列伪随机数,一个序列的第一个随机数对应一个数,这个数称为种子数(seed)。

 简单的说,计算机随机数是通过一个算法(我也不知道)在一串已经定下来的数据中生成,每次生成随机数的起点叫做“种子数”。这个了解一下就行。

🍹rand函数(生成随机数)

在获取随机数的时候我们需要用到rand函数,拿出我们祖传的网站:http://cplusplus.com/ 来了解这rand函数。

这是一个针对函数资料查找的一个网站,在搜索栏写入你想查看的函数就可以的出结果。界面是全英文,在刚开始我们可以用百度翻译来帮助我们,看多了你就会发现,凭自己的能力也能看的懂了。不推荐使用整页翻译,这样会把int,rand,void等等关键词翻译掉,反而不利于我们理解。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

我们来一点一点理解(其实我也是用了百度翻译)。 

b9b888ae379543cda91c247cfb016dfc.png

可以得出,我们无需传数据进去,且它会返回一个整数。

 d05bb7067a50421e80ce3856a8cf9cd3.png

 并且它返回的是一个0到RAND_MAX间的数字。而RAND_MAX的值具体是多大,我们可以医用编译器来看看。和RAND_MAX一样,调用rand也需要声明stdlib头文件。

fbd9f74f6cf34d0d9d8d6e20c2721d39.png

 十六进制0x7fff换算成十进制就是32767。函数给我们的返回值就是0~32767这范围的一个随机数。

通过代码简单试一试,rand函数的效果。

第一次:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_16,color_FFFFFF,t_70,g_se,x_16

 但当我们运行第二次的时候,我们会发现,他返回的数字一模一样。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

如果要求不是很高的话,这样子使用rand函数已经够了。但有一说一,这其实并不是真正的随机数。包括你重启电脑再去运行的话它还是会返回一模一样的结果,因为我们的种子数没有改变。

🍹srand(避免每次运行程序产生的随机数都相同)

   srand()用于初始化rand()使用的随机数种子

cdd368d82dde467fa4438fc774d2885e.png

 我们在代码中加上srand试一试

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 换一个种子数试试:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_18,color_FFFFFF,t_70,g_se,x_16

 我们可以看出,随着种子数的不同系统产生的随机数也是不同的。如果我的种子数是时刻改变的,那我这个程序不是就可以每时每刻都生成不同的数字了。这取决于种子数在每时每刻都不一样,什么样的东西满足我们这个要求呢——时间

🍹时间戳

简单的说,时间戳就是随时间改变而改变的一个整数。比如下面两个例子:

 189ca47dcb9c47bc8a6b4976e8b24ecd.png

1c8909d91e314656ba7cbe0564205bd8.png

 每时每刻都生成不同的数字。要想实现这个目的,只需要将时间戳放入rand函数里去。这里可以用time函数来实现

🥤time函数

 ef5984f11d6d48a485c9d02fb19ccc69.png

 从这个图可得,使用这个函数需要传入一个指针变量,它会返回一个time_t类型的元素,这个元素也是随时间戳改变而改变的。

 PS:time函数需要调用time.h头文件。

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 我们可以看到,两次使用这个程序,它给我们带来的数字是完全不一样的。这样就实现了随机数的取值。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

🍸来个小小项目

这次我们来学习一个小项目的制作,猜数字,规则如下:

在1~100的范围内猜数字n(假如是80),我第一次猜50,被提示小了;第二次猜75,提示小了;第三次猜87,提示大了;第四次猜80,猜对了。

项目思路:

  1. 需要猜测的数字范围是1~100.
  2. 可以重复游玩。
  3. 每次玩的时候数字都要不同。

这个游戏思路不难,而且我们刚好可以联系一下随机数这个概念。一起来吧。

🍸代码实现

🍹1.漂亮的主页

在制作一个游戏时,我们需要一个漂亮的主页,我们把它集成到一个函数中实现。

void menu()
{printf("*********************\n");printf("***** 1.开始游戏 ****\n");printf("***** 0.退出游戏 ****\n");printf("*********************\n");
}

实现效果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

🍹2.游戏开关

接下来我们需要一个实现一个控制游戏开关的代码段。为了我建议用到do while循环,因为它的特点就是:不管三七二十一,先循环一遍。这里我们的程序至少要循环一遍,看看玩家是否继续游戏。

int main()
{int op=0;do{menu();printf("请输入你的选项:");scanf("%d",&op);switch (op){case 1:printf("开始游戏\n");break;case 0:printf("退出游戏");break;default:printf("输入错误,请再次输入\n");break;}} while (op);return 0;
}

这就是运行效果,嗯嗯🧐达到我们的预期了。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 这里有一个小细节,有些小伙伴可能已经注意到了。每写一部分,我就会测试一部分,这是一个编程的小技巧,这样可以有效避免bug的累加,因为bug累计多了,到最后测试的时候你会发现无从下手。

不过这样子也能让博客讲的更清楚,真好🐱‍💻。

接下来进行主要部分的书写。

🍹3.game()函数的代码实现。

void game()
{int ret=rand()%100+1;//实现程序取得的随机数值为1~100int guess=0;do {scanf("%d", &guess);if (guess < ret)printf("猜小了\n");else if (guess > ret)printf("猜大了\n");else{printf("猜对了\n");break;}} while (1);//猜对了才能退出return;
}

第三行这里给程序产生的随机数取mod了,目的在于实现取得的随机数在1~100的范围之内。

同理,如果你想取50~100,可以这样写:

ret = rand () % 50 + 51;

🍹4.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("**********************\n");printf("***** 1.开始游戏  ****\n");printf("***** 0.退出游戏  ****\n");printf("**********************\n");
}
void game()
{int ret=rand()%100+1;int guess=0;do {scanf("%d", &guess);if (guess < ret)printf("猜小了\n");else if (guess > ret)printf("猜大了\n");else{printf("猜对了\n");break;}} while (1);//猜对了才能退出return;
}
int main()
{srand((unsigned int)time(NULL));int op=0;do{menu();printf("请输入你的选项:");scanf("%d",&op);switch (op){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏");break;default:printf("输入错误,请再次输入\n");break;}} while (op);return 0;
}

一个小细节,因为srand函数实质上是对种子数的初始化,我们习惯性将它放在主函数来初始化,而且一个工程只需要定义一次就行了。

到这里这篇文章就算结束了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-M6Z2e56iL5bqP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 尼尔叔叔:你自己去试试看吧。

有个思路很类似的文章二分查找法

也可以学习一下。


http://chatgpt.dhexx.cn/article/eKPOMJOv.shtml

相关文章

如何批量生成个位随机数字

众所周知&#xff0c;条码软件可以批量打印条码二维码以及各种各样的产品标签&#xff0c;功能比较齐全&#xff0c;在输入数据时有各种类型&#xff0c;比如手动输入、计数器生成、数据库字段、日期时间、序列生成、流水号等等。今天小编给大家介绍如何随机生成个位数字。 打开…

使用cmd查看端口号

打开cmd命令窗口&#xff1b;输入 netstat -nao|findstr "端口号" &#xff1b;在本地地址中查看端口号&#xff0c;并记住该进程的PID&#xff1a;在运行中输入taskmgr打开任务管理器&#xff0c;在名称一处右击&#xff0c;选中PID&#xff1b;查看第三步的PID所对…

【cmd命令】查看端口占用情况

1、昨晚安装BIS 6遇到一个问题&#xff0c;本地10000端口被占用&#xff0c;安装进行不下去。 2、通过netstat -ano&#xff08;-a 显示所有socket&#xff0c;包括正在监听的&#xff1b;-n 以网络IP地址代替名称&#xff0c;显示出网络连接&#xff1b;o查看进程pid&#xff…

windows cmd关闭端口命令

netstat -ano|findstr 8906taskkill /pid 23440 /f

cmd解决端口被占用

文章目录 一、winr打开cmd窗口二、查找被占用端口的pid号&#xff0c;例如8080端口三、通过命令杀掉当前pid进程总结 一、winr打开cmd窗口 二、查找被占用端口的pid号&#xff0c;例如8080端口 输入命令&#xff1a;netstat -aon|findstr "8080" 如果有如下输出&…

cmd命令查看端口,并强制关闭该端口号

1.查看端口&#xff08;删除8080是指查看所有端口&#xff09; netstat -aon|findstr 8080 2.强制关闭端口号 taskkill /pid 3784 /f 例如&#xff1a;效果如下图

计算机cmd测试命令,常见CMD网络诊断命令

在维修电脑的时候&#xff0c;我们可以利用一些简单的CAM命令来查看当前网络的一些状态。 操作方法 ,在开始中找到运行框&#xff0c;输入cmd&#xff0c;打开批处理窗口。输入CMD命令按回车键。 1 Ping命令 ping IP地址 &#xff0d;t 用于测试此电脑到目标IP地址的数据连通性…

CMD 命令查看本机的端口占用情况解决办法

操作步骤&#xff1a; 打开cmd命令提示符&#xff0c;输入netstat -ano&#xff0c;可以看到当前本机的所有端口情况。 &#xff08;1&#xff09;地址一栏相关说明&#xff1a;0.0.0.0是对外开放&#xff0c;通过服务域名、ip可以访问的端口。​ 127.0.0.1只能对本机…

cmd+查看远程服务器端口,CMD下查3389远程端口

Windows Server服务器远程登录端口默认为3389&#xff0c;如果要查看确认当前使用的远程登陆端口可以使用tasklist /svc和netstat /ano两条命令查出来。 打开“开始”-“运行”&#xff0c;输入cmd回车进入命令行界面。 输入 tasklist /svc 回车&#xff0c;查看结果&#xff0…

用cmd 命令行关闭端口占用的命令

1.按windowR,输入cmd 2.2.输入命令&#xff1a;netstat -nao | findstr 端口号 我被占用的端口是8088 可以看到对应的进程是8812 3.输入taskkill /pid &#xff08;进程IP&#xff09; 4.taskkill/F /pid 进程IP&#xff0c;可以看到终止成功。

Window 通过cmd查看端口占用、相应进程、杀死进程等的命令

一、 查看所有进程占用的端口 在开始-运行-cmd,输入如下命令可以查看所有进程 netstat –ano二、查看占用指定端口的程序 查询占用了8080端口的进程,最后一列即为PID netstat -ano|findstr "8080"三、杀死相关的进程 方法一:使用任务管理器杀死进程 打开任务…

CMD查杀端口详细教程

windowsr输入cmd并打开 l输入 netstat -aon|findstr “8011” 3.**输入taskkill /pid 176060 -f 杀掉端口 **

8080端口占用cmd命令解决

8080端口占用cmd命令解决 出现上图所示端口占用的问题可以用cmd命令结束正在占用该端口的进程来解决。 1.第一步打开命令行&#xff0c;快捷键WinR 输入cmd&#xff0c;点击确定 2.输入netstat -ano|findstr 8080,按回车。查看8080端口所占用的进程。 3.输入taskkill /f /pi…

Cmd查看端口是否被占用问题

解决方式&#xff1a; 1、先打开cmd输出&#xff1a;netstat -ano | findstr "端口号"&#xff0c;查找端口号是否被占用 2、查看对应的PID信息 也就是最后一行的数字&#xff0c;可以看到图片的PID信息为13128和11372 3、在cmd输入最后输入命令"taskkill -pi…

OC语言构造方法

OC语言构造方法 一、构造方法 &#xff08;一&#xff09;构造方法的调用 完整的创建一个可用的对象&#xff1a;Person *p[Person new]; New方法的内部会分别调用两个方法来完成2件事情&#xff0c;1&#xff09;使用alloc方法来分配存储空间&#xff08;返回分配的对象&#…

oc中写c语言的方法,OC语言description步骤和sel

OC语言description方法和sel OC语言description方法和sel 一、description方法 Description方法包括类方法和对象方法。(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和%输出某个对象时&#xff0c;会调用对象的description方法&#xff0c;并拿到返回值进…

OC语言的概述

&#xff08;一&#xff09;OC的简介 OC语言的全名是Object-C编程语言,在程序员的领航里&#xff0c;我们通常简称为OC语言&#xff0c;那么&#xff0c;提到OC语言&#xff0c;他到底是什么样的一门语言呢&#xff1f;OC语言是基于C语言基础上&#xff0c;在进行了一次更高级的…

OC语言1-前期准备

一、OC简介 Oc语言在c语言的基础上&#xff0c;增加了一层最小的面向对象语法&#xff0c;完全兼容C语言&#xff0c;在OC代码中&#xff0c;可以混用c&#xff0c;甚至是c代码。 可以使用OC开发mac osx平台和ios平台的应用程序。 拓展名&#xff1a; c语言&#xff08;.c …

什么是编程语言C语言,什么是oc语言,oc语言是c语言吗?

作为一个ObjecTIve-C的coder&#xff0c;我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来&#xff0c;但他们也总是联想到ObjecTIve-C看上去实在太难了或者在想这些语法符号都是神马玩意&#xff1f;不错&#xff0c;他们问得非常好…

OC语言类的深入和分类

OC语言类的深入和分类 一、分类 &#xff08;一&#xff09;分类的基本知识 概念&#xff1a;Category 分类是OC特有的语言&#xff0c;依赖于类。 分类的作用&#xff1a;在不改变原来的类内容的基础上&#xff0c;为类增加一些方法。 添加一个分类&#xff1a; 文件结构图&…