猜数字游戏

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

#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个数字。

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

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

原文地址:https://www.cnblogs.com/preacher/p/4828526.html