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


    目录

    一.制作菜单menu

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

    三.编写game函数

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

     2.猜数字功能


    一.制作菜单menu

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

    1. void menu()
    2. {
    3. printf("*****************\n");
    4. printf("*** 1. play ****\n");
    5. printf("*** 0. exit ****\n");
    6. printf("*****************\n");
    7. }

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

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

    1. int main()
    2. {
    3. int input = 0;
    4. do
    5. {
    6. menu();
    7. printf("请选择:>");
    8. scanf("%d", &input);
    9. switch (input)
    10. {
    11. case 1:
    12. game();//尚未编写
    13. break;
    14. case 0:
    15. printf("退出游戏!\n");
    16. break;
    17. default:
    18. printf("选择错误,请重新输入!\n");
    19. break;
    20. }
    21. } while (input);
    22. return 0;
    23. }

    三.编写game函数

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

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

    1. void game()
    2. {
    3. int ret = rand();
    4. printf("%d\n", ret);
    5. return 0;
    6. }

      可以发现,第一次运行的结果和第二次运行的结果是一样的,这貌似并不是随机数。这是因为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函数如下:

    1. void game()
    2. {
    3. int ret = rand() % 100 + 1;
    4. int guess = 0;
    5. while (1)
    6. {
    7. printf("请猜数字:>");
    8. scanf("%d", &guess);
    9. if (guess < ret)
    10. printf("猜小了\n");
    11. else if (guess > ret)
    12. printf("猜大了\n");
    13. else
    14. {
    15. printf("恭喜你,猜对了\n");
    16. break;
    17. }
    18. }
    19. return 0;
    20. }

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

  • 相关阅读:
    阿里云11.12重大故障原因曝光
    列表按绝对值逆序排序,并保存下标 python
    GD32F450的时钟笔记
    基于stm32单片机农业智能温室大棚温湿度光照测量报警系统Proteus仿真
    NCO IP Core
    每天一个设计模式之工厂模式(无工厂、简单工厂、工厂方法、抽象工厂)
    WPF 控件专题 GroupBox控件详解
    oracle学习22-ora-01691和修改密码过期时间
    R语言进度条:txtProgressBar功能使用方法
    Mybatis中的动态SQL和缓存
  • 原文地址:https://blog.csdn.net/zzzzzhxxx/article/details/132635456