zoukankan      html  css  js  c++  java
  • 囚犯生存概率引发的循环思考

    有一个囚犯,国王打算处决他,但仁慈的国王给了他一个生还的机会。现在摆在他面前有两个瓶子,一个里面装了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 

  • 相关阅读:
    Debian Linux 查看用户命令
    WPF 样式(Style)(2)
    SQLServer2012下更改数据库名字
    WPF 触发器Triggers
    随记
    网页打印总结(1)
    安装node.js,CoffeeScript,Express.js,mysql,jade
    javascript——this
    win8下IIS8.0下uploadifyv3.1上传文件超过30M,报HTTP Error(404)
    Linux软件安装常用方法(转载)
  • 原文地址:https://www.cnblogs.com/hold/p/2286807.html
Copyright © 2011-2022 走看看