囚犯生存概率引发的循环思考
有一個囚犯,國王打算處決他,但仁慈的國王給了他一個生還的機會。現(xiàn)在擺在他面前有兩個瓶子,一個里面裝了50個白球,一個裝了50個黑球,這個囚犯有一個機會可以隨便怎樣重新分配這些球到兩個瓶子中(當(dāng)然,要保證不空),分配完了之后囚犯被蒙上眼睛,國王隨機取一個瓶子給他,他在里面摸出一個球(因為蒙著眼睛,所以也是隨機抽取),如果白球,則活,否則掛掉。問,這個囚犯如何分配,才能最大化生還幾率。
答案當(dāng)然誰都能猜到,就是只把一個白球放過去。我編了個循環(huán)試了試。遇到問題如下:
我假定一個瓶子中球總數(shù)為:zongshu,白球數(shù)為baiqiu,囚犯活下來的概率為rate。循環(huán)如下:
?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;
}
這個循環(huán)是錯誤的,程序結(jié)果有問題,居然能把rate算到大于1。百思不得其解。而后我改了一下試試。定義了基于heiqiu和baiqiu的循環(huán)如下:
?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;
?}
結(jié)果正確。大家知道這是為什么么?
想到問題所在了吧?但是如果重寫循環(huán)你是很難發(fā)現(xiàn)這個錯誤的,所以在定義循環(huán)時你一定要注意循環(huán)是否考慮完全。避免犯這樣的錯誤。
?
?
一程序中的錯誤為:限制白球小于50,沒有限制黑球(zongshu-baiqiu)小于50?
轉(zhuǎn)載于:https://www.cnblogs.com/hold/archive/2010/04/27/2286807.html
總結(jié)
以上是生活随笔為你收集整理的囚犯生存概率引发的循环思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在项目中让Ajax面向对象 (二)
- 下一篇: 开源界的 5 大开源许可协议