用C++编的猜数字程序,由程序来猜

C语言猜数字程序修改问题及解决
[从csdn上我的旧巢里面转过来的]

猜数字游戏:
? 即有四位十进制数字,一般可猜8次
? 每次返回aAbB(A表示数字正确并且位置正确,B表示数字正确但位置不正确)
? 如:假设要猜的数字是1234,如果游戏者猜0134即返回2A1B(3、4为A,1为B)

思路:
? 模拟人猜数字的过程,先构造一个集合包括所有可能的数字(10*9*8*7=5040种),先乱猜一个,根据返回xAxB来把原来集合里面的不符合的都删掉,然后根据选取下一个。选下一个的原则是:选最能区分剩下的集合的那个数,即:被选择的那个数得到的返回值为xAxB中任意一种的概率差不多。
? 我使用信息量的方法,即:
?? 对集合set(size个)中每一个数字n,用n的每一种返回值(从0a0b到4a0b,共有15种)做删减,看各剩下多少个,用pi表示第i种返回值得情况,然后根据信息量公式:info(n) = ∑(pi/size) * log(pi/size)计算,然后取max(info(i)) i=0..size;最大的那个info(n)对应的数字就是被选择的数字。

http://files.cnblogs.com/realfun/GuessNum.rar

压缩包中包括源码和经过VC6.0编译生成的可执行文件
GuessNumGame.dsw:简易的猜数字游戏
GuessNum.dsw:由计算机来猜数字,基本上6-7次就可以了
GuessNumAll.cpp:尚未编好,打算用来使用决策树方法猜数字,并可以算出对所有的数最多需要多少次

思路简单,但是计算起来很慢,做成Release版还勉强可以忍受有没有其他方法比较快啊?

版权声明:优快云是本Blog托管服务提供商。如本文牵涉版权问题,优快云不承担相关责任,请版权拥有者直接与文章作者联系解决。


[ 点击此处收藏本文]

发表于2004年08月21日 8:12 AM

评论

2004-08-23 9:46 AM

用电脑猜7次内可以猜出,我的程序在DURON 700 128M 里第一次猜最久用了2~3秒,随后就很快了。

2004-08-24 11:11 AM

呵呵我的也是,应该可以优化的
还有个朋友说什么动态信息量,据说会很快感觉不到停顿,不知道他怎么做的

2005-01-15 11:44 PM

你好,很感谢你的程序代码的公开
现在我想修改你的程序把猜的数字为(1-9)
修改如下: 1.建立完备集时排除有"0"的数
2.第一次猜的随机数也过滤掉"0"
/*
* 文件名称: GuessNum.cpp
* 程序描述: 实现GuessNum类
* 编制日期: 2003-05-28
* 程序作者: realfun
* 联系方式: rzfemail@etang.com
*/
#pragma warning(disable:4786)

#include <iostream>
#include <algorithm>
#include <ctime>
#include <strstream>
#include <cmath>
#include "GuessNum.h"

const int GuessNum::m_base[5] = {0, 5, 9, 12, 14};

GuessNum::GuessNum()
{
m_times = 0;

//产生m_setAll
unsigned int num=123;//#我修改为unsigned int num=124
char a[10];
while (num < 10000)
{
bool valid = true; //表示数字没有重复
sprintf(a, "%04u", num);
for (int i=0; i<4; i++)
{
for (int j=i+1; j<4; j++)
if (a[i]==a[j]) valid = false;//#我把这句改为了if (a[i] == a[j] || a[j] == 0 || a[i]==0) valid = false;
}
if (valid) m_setAll.push_back(a);
num++;
}//#while(num)
}//#GuessNum()
但调试的结果并没有排除有"0"的数-----这是为什么.能我解释下我的迷惑....先谢谢你
在随机数部分我也做了一样的修改但还是没有效果--这是为什么啊

因为我并没有学VC++.只对C比较熟悉些.不托的地方还请包涵.希望你能帮我解决这迷惑.谢谢 我的E-MAIL:webmaster@zq520.net

2005-01-17 5:25 PM

我自己已经解决了, 谢谢你的程序

2005-01-17 5:26 PM

我自己已经解决 谢谢你提供的程序和代码

2005-01-17 5:27 PM

修改我自己已经解决了 谢谢你提供的程序代码和程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值