囚犯生存概率引发的循环思考

有一个囚犯,国王打算处决他,但仁慈的国王给了他一个生还的机会。现在摆在他面前有两个瓶子,一个里面装了50个白球,一个装了50个黑球,这个囚犯有一个机会可以随便怎样重新分配这些球到两个瓶子中(当然,要保证不空),分配完了之后囚犯被蒙上眼睛,国王随机取一个瓶子给他,他在里面摸出一个球(因为蒙着眼睛,所以也是随机抽取),如果白球,则活,否则挂掉。问,这个囚犯如何分配,才能最大化生还几率。

答案当然谁都能猜到,就是只把一个白球放过去。我编了个循环试了试。遇到问题如下:

我假定一个瓶子中球总数为:zongshu,白球数为baiqiu,囚犯活下来的概率为rate。循环如下:

 for( zongshu=1; zongshu<100; zongshu++){
  for(baiqiu=0;(baiqiu<=zongshu)&&(baiqiu<=50); baiqiu++){
   temprate=(double)baiqiu*0.5/(double)zongshu+(double)(50-baiqiu)*0.5/(double)(100-zongshu);
   if(temprate>rate) {
    rate=temprate;
    b= baiqiu;
    z= zongshu;

   }

   else continue;

 }

continue;

}

这个循环是错误的,程序结果有问题,居然能把rate算到大于1。百思不得其解。而后我改了一下试试。定义了基于heiqiu和baiqiu的循环如下:

 for(heiqiu=0;heiqiu<=50;heiqiu++){
  for(baiqiu=1;baiqiu<=50;baiqiu++){
   int zongshu=heiqiu+baiqiu;
   temprate=(double)baiqiu*0.5/(double)zongshu+(double)(50-baiqiu)*0.5/(double)(100-zongshu);
   if(temprate>rate) {
    rate=temprate;
    b= baiqiu;
    z= heiqiu+baiqiu;
   }
   else continue;
  }
  continue;
 }

结果正确。大家知道这是为什么么?

想到问题所在了吧?但是如果重写循环你是很难发现这个错误的,所以在定义循环时你一定要注意循环是否考虑完全。避免犯这样的错误。

 

 

一程序中的错误为:限制白球小于50,没有限制黑球(zongshu-baiqiu)小于50 

posted @ 2010-04-27 11:15  郑小明  阅读(1925)  评论(1编辑  收藏  举报