【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;
}

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

目录
相关文章
|
11天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
31 10
|
11天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
29 9
|
11天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
28 8
|
11天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
28 6
|
11天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
67 6
|
11天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
40 6
|
11天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
20 5
|
7月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
218 3
|
2月前
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
|
6月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节