zoukankan      html  css  js  c++  java
  • 猜数字游戏

      猜数字游戏,被用烂的标题,百度一下,随处可见。
      今天开篇用这一标题,实在是无标题可选了,主要是不知道自己写点什么,不知不觉中,就把下面代码写好了。
      这个是我第一意识产生的东西,仔细修改,还可以更好,盯着这段代码,突然发现可以写点什么了。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        int initArr[4]= {-1};
        srand(time(NULL));
    
        //=====随机生成一个猜测数 ↓↓↓↓====
        initArr[0] = rand()%9+1;//首位数字1~9
    
        for(int i=1; i<4; i++) //生成2、3、4位上的数字
        {
    GOTO1:
            initArr[i] = rand()%10;
            for(int j=0; j<i; j++)
            {
                if(initArr[j]==initArr[i])
                {
                    goto GOTO1;
                }
            }
        }
        //=====随机生成一个猜测数 ↑↑↑↑====
    
        //====猜数字 ↓↓↓↓====
        int initArr2[4],input,itemp, countA, countB, times;
        do
        {
            countA=0;
            countB=0;
            times=0;
    
            printf("请输入一个四位数字:");
            scanf("%d",&input);
            if( input > 9999 || input < 1000 )
                continue;
    
            itemp = input;
            initArr2[3] = itemp%10;
            itemp = itemp/10;
            initArr2[2] = itemp%10;
            itemp = itemp/10;
            initArr2[1] = itemp%10;
            itemp = itemp/10;
            initArr2[0] = itemp%10;
    
            for(int i=0; i<4; i++)
            {
                for(int j=0; j<4; j++)
                {
                    if(initArr[i] == initArr2[j])
                    {
                        if (i==j)
                            countA++;
                        else
                            countB++;
                    }
                }
            }
    
            times++;
            printf(" %4d  %4d  %dA  %dB
    ",times,input,countA,countB);
        }
        while(countA != 4);
    
        printf("恭喜您,回答正确!");
        printf("pause");
    
        return (0);
    }

    (假设rand生成所有随机数的概率相同,方便以下的概率计算,其实rand生成所有随机数概率不同)

    本贴中代码实现的自动生成4位数字

      比如要生成随机数ABCD,首先ABCD互不相等,再次A不为0。

      可用不能重复数字0,1,2,3,4,5,6,7,8,9。

    • 第1位数字选择,9选(弃0),假设选中A,命中率9/9
    • 第2位数字选择,9选(弃A),假设选中B,命中率9/10
    • 第3个数字选择,8选(弃A、B),假设选中C,命中率8/10
    • 第4个数字选择,7选(弃A、B、C),命中率7/10

      所以,总体命中率为9/9 * 9/10 * 8/10 * 7/10 = 0.504
      也就是说,用本帖中的代码生成一个符合要求的4位数,大概需要4/0.504=7.9365次生成随机数操作。

    =======================

    本题可以使用下面方法生成随机数


      比如定义一个数字 array[10]={0,1,2,3,4,5,6,7,8,9};
      array中的最大索引maxIndex=10; .................①
      每次生成随机数 randNum=rand()%maxIndex;
      在array中找到这个数字,并从数组中删除,maxIndex值减一,假设randNum==6,array中值6对应的数字后面一位移动到前面一位,最终array[10]={0,1,2,3,4,5,7,8,9,9},此时不要忘记了maxIndex在上面已经做了减一操作,maxIndex==9;
      继续执行①,直到产生4个数字。

      方法很多很多吧,举不胜举,选择最擅长,最合理的方法。

      程序设计分创意阶段、规划阶段、实现阶段和调试阶段,只有养成了良好的设计习惯,才能保证在制作大项目的时候游刃有余。倘若一上手就冲动的写程序会导致最终的寸步难行,甚至中途放弃。

  • 相关阅读:
    重载函规则
    lambd
    内联函数
    c和c++中的枚举和 区别
    关于于c++中的类型转换
    作用域解析运算符
    day01
    二级指针输入特性
    二级指针的 数出特性
    influence maximization 第二弹
  • 原文地址:https://www.cnblogs.com/preacher/p/4828526.html
Copyright © 2011-2022 走看看