【C语言】猜数字小游戏——深度刨析rand函数生成随机数

简介: 【C语言】猜数字小游戏——深度刨析rand函数生成随机数

一.制作菜单menu

定义一个menu函数来打印游戏菜单

void menu()
{
  printf("*****************\n");
  printf("*** 1. play  ****\n");
  printf("*** 0. exit  ****\n");
  printf("*****************\n");
}

二.调用menu函数并设置判断

首先在do while内调用menu函数,然后用input接收用户输入并用switch判断,当输入0时退出游戏,输入1时进入游戏,为了防止用户输入0 1 以外的数字,用default进行提示并重新开始输入。此时一个简易的菜单便制作完成。

int main()
{
  int input = 0;
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();//尚未编写
      break;
    case 0:
      printf("退出游戏!\n");
      break;
    default:
      printf("选择错误,请重新输入!\n");
      break;
    }
  } while (input);
  return 0;
}

三.编写game函数

1.首先需要生成1~100的随机数

生成随机数是这个游戏最核心的部分。 C语言中提供了一个生成随机数的函数rand(),通过这个函数就可以生成随机数。但是如果只是调用rand函数,大家可以发现一些问题。

void game()
{
  int ret = rand();
  printf("%d\n", ret);
  return 0;
}

 可以发现,第一次运行的结果和第二次运行的结果是一样的,这貌似并不是随机数。这是因为rand函数生成的其实是伪随机数,伪随机数是通过某种算法生成的随机数,因此这个随机数就并不是很“随机”,生成范围是0~RAND_MAX(即32767)。

而正确使用rand函数的方法是,在rand函数产生随机数之前,使用srand函数设置随机数的生成器,srand函数的参数可以叫做种子,类型是unsigned int,头文件为:stdlib.h

 1.当在rand函数之前使用srand(1)设置时,可以发现结果与上面的结果是一致的,这就证明了当只是使用rand函数生成随机数时,其默认种子便是1。一但种子固定了,生成的随机数也就固定了,这也就很好的解释了为什么两次运行出来的随机舒适一致的。

 2.了解完这一点之后,我们就可以想,只要让srand的种子变动起来,那么rand函数生成的随机数便可以随机起来。

我们都知道时间是在不停发生变化的,C语言中提供了一个函数time头文件为:time.h,该函数可以返回一个时间戳,时间戳代表的是当前机器时间相较于计算机的起始时间之间的差值,即1970年1月1日开始到当前时间的差值,单位是秒,通过这个时间戳也可以转换成正常时间。

因此只要我们能够获得这个时间戳, 并将它作为srand函数的种子,那么rand函数生成出来的随机数就能真的随机。因为srand函数的参数类型是unsigned int,因此time(NULL)还需要强制类型转换。

通过以上设置,此时出来的便是随机数了 ,但是此时的随机数范围仍然是0~RAND_MAX(即32767)。需要生成0-100的随机数,只要将rand()%100,就可以得到0~99的数,再在结果后+1,范围便是1~100了。那么生成1~100的随机数就完成了。

2.猜数字功能

有了随机数,剩下的就很简单了,只需要判断键盘输入的值与随机数的关系,比随机数大就输出猜大了,比随机数小就输入猜小了,相同则猜对了,那么完整的game函数如下:

void game()
{
  int ret = rand() % 100 + 1;
  int guess = 0;
  while (1)
  {
    printf("请猜数字:>");
    scanf("%d", &guess);
    if (guess < ret)
      printf("猜小了\n");
    else if (guess > ret)
      printf("猜大了\n");
    else
    {
      printf("恭喜你,猜对了\n");
      break;
    }
  }
  return 0;
}

如果觉得作者写的不错,求给作者一个大大的点赞支持一下,你们的支持是我更新的最大动力!

目录
相关文章
|
2天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
4天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
4天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
4天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
7天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
7天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
9 1
|
7天前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
5 0
|
API C语言
C语言编程之经典小游戏--贪吃蛇
C语言编程之经典小游戏--贪吃蛇
287 0
C语言编程之经典小游戏--贪吃蛇
|
机器学习/深度学习 安全 定位技术
C语言小游戏------贪吃蛇
C语言写的贪吃蛇小游戏
225 0
|
8天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)