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 

  • 相关阅读:
    uva 11078
    hdu1520(树状dp)
    从Markov Process到Markov Decision Process
    剑指Offer系列编程题详解全集
    L1正则和L2正则的区别详解
    协方差详解
    牛顿法和梯度下降法的比较
    C++ const各种用法总结
    Exploration and Exploitation
    RL Algorithm Components
  • 原文地址:https://www.cnblogs.com/hold/p/2286807.html
Copyright © 2011-2022 走看看