努力自学的小菜张 2023-04-08 01:09 采纳率: 50%
浏览 23
已结题

关于ret和getchar()及随机数种子stand()与rand()

img


1、请问第十三行为什么条件是ret!=1,而不是ret=0?(因为scanf函数错误的时候返回值是0所以我认为应该是ret=0)
2、请问第十五行的gatchar()!='\n'为什么是清除缓冲区中的输入字符作用?(没太看懂这行表达的是什么意思)
3、请问随机数种子srand()和rand()是什么关系?srand()括号里的整数是表示什么?
谢谢大家!感激不尽!

  • 写回答

2条回答 默认 最新

  • a5156520 2023-04-08 10:17
    关注

    1、第13行改为 ret==0 也是可以的,ret!=1 表示正确读取的数目不是1 ,也就是代表读取数据错误,ret==0代表正确读取到的数据项数为0,在这个程序里也可以代表scanf()读取数据错误,所以也是可以的;

    2、第15行while(getchar()!='\n'); 是 当scanf()正确读取到的数据项不为1,则可以清除缓冲区的数据 ,让scanf()不会阻塞,此行放到while循环后面可以在正确读取到数据时时,缓冲区多余的数据的作用。

    3、srand()是用于设置随机数种子,这个随机数种子会决定后面调用rand()函数产生的随机数,srand()函数里的整数表示随机数种子,rand()%100+1 为产生一个1~100之间的随机数。

    测试代码如下:

    参考链接:






    
    
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int main(void){
        
        int magic,guess,counter=0;
        int ret;
        
        // https://zhidao.baidu.com/question/1968010491949209140.html
        // https://baike.baidu.com/item/srand/796881?fr=aladdin
         // 使用当前系统时间来作为随机数的种子,可以让每次产生的随机数会出现更多变化,
         //因为每次系统时间都是一个不同的数, 而这个种子数与后面产生的随机数有关联关系  
        srand(time(NULL));
        
        // https://blog.csdn.net/zcr_59186/article/details/123644402 
        // https://www.zhihu.com/question/491046741
        // rand()一个产生 0~RAND_MAX之间的伪随机数,rand()%100 把这个数对100求余后变成0~99之间的一个数
        // 然后+1变为一个1~100之间的数,如此可以实现产生一个1~100的随机数 
        magic = rand()%100+1;
        do{
            printf("Please guess a magic number:");
            // https://baike.baidu.com/item/scanf/10773316?fr=aladdin
            ret = scanf("%d",&guess);
            
            while(ret!=1){  //改为ret==0 也可以 
             // 当scanf()正确读取到的数据项不为1,则可以清除缓冲区的数据 
             // 此行再放到while循环后面更好 
                while(getchar()!='\n'); 
                printf("Please guess a magic number:");
                ret = scanf("%d",&guess);
            }
            
            while(getchar()!='\n');  // scanf()正确读取到数据后,可以清除缓冲区多余数据 ,加上这个可能更适合一点 
                
            counter++;
            
            if(guess>magic){
                printf("Wrong! Too big!\n");
            }else if(guess < magic){
                printf("Wrong! Too small!\n");
            }else{
                printf("Right!\n");
            }
        }while(guess!=magic&&counter<10);
        
        printf("counter = %d\n",counter);
        
        return 0;
        
    } 
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元