猜数字游戏
猜数字游戏,被用烂的标题,百度一下,随处可见。
今天开篇用这一标题,实在是无标题可选了,主要是不知道自己写点什么,不知不觉中,就把下面代码写好了。
这个是我第一意识产生的东西,仔细修改,还可以更好,盯着这段代码,突然发现可以写点什么了。
#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\n",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个数字。
方法很多很多吧,举不胜举,选择最擅长,最合理的方法。
程序设计分创意阶段、规划阶段、实现阶段和调试阶段,只有养成了良好的设计习惯,才能保证在制作大项目的时候游刃有余。倘若一上手就冲动的写程序会导致最终的寸步难行,甚至中途放弃。