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