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 

  • 相关阅读:
    Tomcat6.0 sqlServer2000 配置连接池操作
    SQL GROUP BY 实例
    Java 获取当前系统时间 格式:yyyyMMdd HH:mm:ss
    银行科技与业务融合之道
    银行IT部门科技管理流程管控工作发展之路
    银行科技管理工作优化提升之我见
    事务脚本的缺点以及领域模型的优点
    异常的分级分类与处理策略
    软件高性能的思考
    软件行业的一个发展推力就是不断提高用来构造软件的基础元素,也就是所谓的编程模型
  • 原文地址:https://www.cnblogs.com/hold/p/2286807.html
Copyright © 2011-2022 走看看