【C语言】:详解随机数的生成和猜数字游戏的实现

简介: 【C语言】:详解随机数的生成和猜数字游戏的实现

1.随机数的生成

想要完成猜数字游戏,首先要产生随机数,下面将介绍如何产生随机数。

1.1 rand

C语言提供了一个函数rand,可以产生随机数,需要包含头文件stdlib.h

函数原型:int rand (void)

rand函数会返回一个伪随机数(因为它是由算法生成的,不能算做纯粹的随机),这个随机数的范围是0~RAND_MAX之间,大部分编译器上的RAND_MAX是32767。

我们可以测试一下rand函数,多测试几组,观察随机数:

#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函数默认的种子是1。

所以说,我们想要用rand函数产生随机数,就必须要让它的种子不断的发生变化,从而每次运行产生的随机数都不相同,那我们该如何做呢?

2. srand

C语言又提供了一个函数srand,用来初始化随机数生成器的,引用的头文件是stdlib.h

函数原型:void srand (unsigned int seed)

程序在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的种子,只要种子在变化,每次生成的随机数也会发生变化。

那也就是说,只要seed是随机值,那rand每次运行也将产生随机数,在生成随机数的时候又需要一个随机数,那这不是矛盾了吗,要如何解决这个问题呢?

3. time

我们一般是使用程序运行的时间作为种子的,因为时间每时每刻都在变化。

C语言中有一个函数叫time,可以获得这个时间,需要包含头文件time.h

函数原型:time_t time(time_t* timer)

time_t的本质是无符号整型

如果它的参数是NULL,就返回这个时间的差值,C语言中称time函数返回的那个差值叫做时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

我们使用这三个函数再次进行随机数的生成:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    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;
}

第一次调试结果:

第二次调试结果:

由上图可知,多次运行产生的数据不同了,这就实现了随机数的生成。

2. 猜数字游戏实现

接下来我们就可以利用上文所说的产生随机数的方法来实现一个简单的猜数字小游戏。

游戏要求如下:

  1. 电脑自动生成1-100的随机数;
  2. 根据玩家猜测数据的大小给出大了或小了的反馈;
  3. 玩家共有5次机会,用完就失败,游戏结束。

代码实现如下:

//菜单
void menu()
{
  printf("#########################\n");
  printf("#####    1.play     #####\n");
  printf("#####    0.exit     #####\n");
  printf("#########################\n");
}
//猜数字的过程
void game()
{
  int ret = rand() % 100 + 1;//生成1~100之间的数字
  int guess = 0;
  int count = 5;
  while (count)
  {
    printf("你现在还有 %d 次机会\n", count);
    printf("请输入要猜的数字:>");
    scanf("%d", &guess);
    if (ret < guess)
    {
      printf("猜大了\n");
    }
    else if (ret > guess)
    {
      printf("猜小了\n");
    }
    else
    {
      printf("恭喜你,猜对了!\n数字是%d\n", guess);
      break;
    }
    count--;
  }
  if (count == 0)
  {
    printf("很遗憾,5次机会用完,挑战失败,随机数是%d.\n", ret);
  }
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏!\n");
      break;
    default:
      printf("选择错误,请重新选择:>");
      break;
    }
  } while (input);
  return 0;
}

这里我们需要注意的是如何设置随机数的范围,我们知道,一个数%(模运算)100的余数一定是0~99,再+1就生成1到100的范围

再比如我们要随机生成100到200之间的数据时,只需要用rand()%101+100即可,因为一个数%101的余数一定是0到100,在+100后范围就是100到200了。

目录
相关文章
|
3月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
112 8
|
4月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
158 0
|
3月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
91 2
|
3月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
53 1
|
4月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
124 1
|
4月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
110 2
|
4月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
129 1
|
4月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
78 0
|
4月前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
54 0
|
4月前
|
程序员 C语言
初识C语言之三子棋游戏
初识C语言之三子棋游戏
46 0