| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1432 人关注过本帖
标题:老师布置的作业 求高手解答
只看楼主 加入收藏
小木虫
Rank: 1
等 级:新手上路
帖 子:4
专家分:4
注 册:2012-6-2
收藏
得分:1 
回复 6楼 never_yzq
亲~case 后好像只能跟常量表达式吧
2012-06-02 22:14
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 20楼 有容就大
工程上比较喜欢用黄金比(φ = (sqrt(5)-1) / 2 = 0.618...) 来划分那个区间。据说比简单二分法命中率能提高一些。

猜的过程可能是如下的样子:
1000
618 > 469
382 < 469
527 > 469
472 > 469
最后得的区间是 (382, 472), 区间长度/总长度 = 90 / 1000 = 9%, 估值是 416 或 437,相对误差 (469-437)/469 = 6.8%。

如果它第三步先猜的是 472,结果是:
1000
618 > 469
382 < 469
472 > 469
437 < 469
最后得的区间是 (437, 472), 区间长度/总长度 = 35 / 1000 = 3.5%, 估值是 450 或 459,相对误差 (469-459)/469 = 2.1%。

一般认为 4 次猜测,可以把误差控制在 10% 以内都是可以接受的。

不过这道题如果你用二分就赢了:
1000
500 > 469
250 < 469
375 < 469
438 < 469
区间 (438, 500), 62/1000 = 6.2%, 估值是 469,命中。


[ 本帖最后由 pangding 于 2012-6-2 23:56 编辑 ]
2012-06-02 23:17
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 22楼 pangding
这么一分析就明朗多了 黄金分割不错的主意。

梅尚程荀
马谭杨奚







                                                       
2012-06-03 08:41
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
pangding是数学专业的吧,数学讲的不是感觉和个人喜好,请证明一下在被猜数呈平均分布的情况下黄金分割比二分法的命中率高些。

更直白的说,就请计算一下两种方案下猜中的概率。

重剑无锋,大巧不工
2012-06-03 09:38
glglzb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:22
注 册:2011-10-12
收藏
得分:1 
二分法
2012-06-03 11:10
阿鞠尼
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:首尔
等 级:蒙面侠
威 望:5
帖 子:1467
专家分:4442
注 册:2012-5-30
收藏
得分:1 
回复 8楼 heifeng2012
#include <stdio.h>
#include <string.h>
void game();
void game()
{
    int data;
    int count=0;
    do
    {
    printf("请猜数字(0--1000):");
    scanf("%d",&data);
    if(data>=500)
    {
       printf("请往500以下猜!!!\n\n");
       count++;
    }
    if(data<=250)\\\\\\\\\\\\\\\\\\\\\\\\(这里为什么是250呢 我觉得应该是469啊)
    {
       printf("请往250以上猜!!!\n\n");
      count++;
    }
    if(data==469)
    {
       printf("\t\t恭喜,您答对了!宝贝归您了...\n");
       break;  
    }
   
    printf("\t\t请谨慎,您还有%d次机会\n",6-count);////////////////////////////(还有这里 应该是5-count吧)
    }while(count!=6);
if(count==6)
{
    printf("悲剧。。。。\n");
    sleep(1000);///////////////////////////////////////(这是什么意思呢  求指教啊)
   
}
}
int main()
{
game();

    sleep(508888888888888800);///////////////////////(还有这里 不懂 求指教)
    return 0;///////////////////(这里 也是不懂啊 求指教)
}

喜欢睡觉 却经常熬夜
2012-06-03 11:27
zzm875402431
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2012-6-3
收藏
得分:1 
这么简单
#include <stdio.h>
void main()
{
    int a,i;
    i=0;
        while(i<5)
        {
            if(i>=1) printf("还剩%d次\n",5-i);
            printf("请输入价格:");
            scanf("%d",&a);
             if(a==469)
             { printf("恭喜,您答对了!宝贝归您了。\n");
                 i=i+6;
             }
             if(a>250 && a<500 && a!=469)
             {printf("接近答案!\n");
                 i++;
             }
             if(a>=500)
             { printf("错误,在500以下\n");
                 i++;
             }
             if(a<=250)   
             { printf("错误,在250以上\n");
                  i++;
             }
        }

printf("没机会啦!\n");
}
2012-06-03 14:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 27楼 zzm875402431
你觉得你对题目的理解对么?

重剑无锋,大巧不工
2012-06-03 15:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 24楼 beyondyf
我感觉,就这道题而言,确实二分在理论上比黄金分割好:

设 x 服从 [0, 1] 区间上的均匀分布 U(0,1),求一分点 λ,0 < λ < 1,使得 x 落入所分区间的长度尽可能的短。
由题意,所分二区间长度分别为 λ 和 1-λ。由均匀分布,落入它们的概率也分别为 λ 和 1-λ。
则划分区间后,x 落入区间长度的期望为:
E(l) = λ*λ + (1-λ)*(1-λ) = 2λ^2 - 2λ + 1 = [sqrt(2)*λ - 1/sqrt(2)]^2 + 1/2
可见 λ = 1/2 的时候,期望的长度最短,是 1/2。


工程上之所以喜欢黄金分割是因为,一般的最优化问题,只算出一点是无法判断最优解的取值区间的(即使欲求函数是凸函数)。

考虑一个开口向上的抛物线,它是典型的凸函数。设初始区间 (a, b) 包含它的最低点 x。
如果我只在其中计算一点的函数值,是无法判断最低点到底是在所选点的左侧还是右侧。
为了判断这个问题,需要在该区间上取两点计算函数值。比如 a < t1 < t2 < b。那么:
如果 f(t1) >= f(t2),则 x 一定在 (t1, b) 内。否则必在 (a, t2) 内。
这时取黄金点,不仅可以保证这两个区间的长度相等,并且 t1 也是 (a, t2) 的一个黄金分点。这使得如果要在 (a, t2) 上做下一次迭代,可以少计算一次函数值。并且这种取点方法有很高的收敛速度(每次可以使区间缩短为原来的 0.618)。在工程上这就可能意味着少做一次实验,从而大量节约成本。
理论上使用 Fibonacci 分点,也可以满足这个条件,并且收敛速度最快。但菲氏数列(我记作 f[n])看上去比较复杂,而且每次迭代的收缩比 f[n+1]/f[n],不是常数。这个比值的极限正好是黄金比。并且在实践上,使用黄金分点和使用菲氏分点取得的效果差距不大,从而黄金分割法就在工程上取得了比较广泛的应用。


[ 本帖最后由 pangding 于 2012-6-3 16:05 编辑 ]
2012-06-03 15:55
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:1 
概率好像大约是千分之三十一。
2012-06-03 16:33
快速回复:老师布置的作业 求高手解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032907 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved