《程式設計之美》284頁,問題4.6:桶中取黑白球。
有乙個桶,裡面有白球、黑球各100個,人們必須按照以下規則把球取出來:
1. 每次從桶中拿兩個球;
2. 如果兩球同色,再放入乙個黑球;
3. 如果兩球異色,再放入乙個白球;
於是我開始分析,桶裡裝球,每次摸球是隨機的,所以不能用佇列和棧,那就用萬能的動態列表來做桶吧。按照題目描述的順序,寫出取球的過程,最後剩的是黑球返回1,白球返回2,其他情況(沒球了)返回3,然後根據概率在大資料量下將會趨於穩定的性質無限取球,最後趨於穩定的那個數就是答案。
**如下(注釋的部分為除錯程式過程中用到的測試**,用來顯示操作過程中取球、放球、以及桶中球的詳細變化過程):
using我因為不小心將一處的「whiteball」寫成了「whileball」而一度修改卻得不到正確的答案,最終一步一步的通過上面的測試**,才將出錯範圍最終鎖定在了初始化bucketballs的for迴圈內,最終發現我將「whiteball」寫成了「whileball」。改過來以後,執行結果終於正確了。下面是去掉測試**的最終版:system;
using
system.collections.generic;
using
system.linq;
namespace
bucketball
count++;
"count:" + count);
probability = math.round((double)1.0 * targetcount / count, 2
); console.writeline(probability);
} }
private
static
int play(listbucketballs)
//printlist(bucketballs);
random ran = new
random();
while (bucketballs.count() > 1
)
else
bucketballs.count());
}
if (bucketballs.count() == 1
)
else
}private
static
void printlist(listbucketballs)
console.writeline();
}private
static
void put(list bucketballs, string
v)
private
static list take(list bucketballs, int
v, random ran)
return
balls;}}
}
using通過執行結果可以看出來,概率一直很穩定,為1:system;
using
system.collections.generic;
using
system.linq;
namespace
bucketball
count++;
probability = math.round((double)1.0 * targetcount / count, 2
); console.writeline(probability);}}
private
static
int play(listbucketballs)
random ran = new
random();
while (bucketballs.count() > 1
)
else
}if (bucketballs.count() == 1
)
else
}private
static
void put(list bucketballs, string
v)
private
static list take(list bucketballs, int
v, random ran)
return
balls;}}
}
所以答案是在白球和黑球各100個的前提下取球放球,最後都只剩下黑球,概率為1。
修改程式中的初始化引數還可以用來求解課後題中的拓展情況,不用動腦。大家可以試試。
總結過程中遇到的問題:
1、字串賦值的時候一定要仔細,別寫錯了!
2、random.next()函式返回值的範圍包括 minvalue 但不包括 maxvalue。minvalue equals maxvalue, minvalue is returned.">如果 minvalue 等於 maxvalue,則返回 minvalue。
程式設計之美 桶中取黑白球問題
有乙個桶,裡面有白球 黑球各100個,人們必須按照以下規則把球取出來 每次從桶裡面拿兩個球 如果是兩個同色的球,就再放入乙個黑球 如果是兩個異色的球,就再放入乙個白球。問題是 最後桶裡面只剩下乙個黑球的概率是多少?針對這樣乙個問題,我們有兩種不一樣的解法 方法一 首先,我們可以通過相應的數學式來建立...
程式設計之美 桶中取黑白球
題目 有乙個桶,裡面有白球 黑球各100個,人們必須按照以下的規則把球取出來 1 每次從桶裡面拿出來兩個球 2 如果是兩個同色的球,就再放入乙個黑球 3 如果是兩個異色的球,就再放入乙個白球 解法一 用黑白球各兩個,來模擬,從小到多,化繁為簡,進行分析和推斷,找出其內在的規律,並歸納總結。推斷出 每...
程式設計之美 4 6 桶中取黑白球
題目 有乙個桶,裡面有白球 黑球各100個,人們必須按照以下的規則把球取出來 1 每次從桶裡面拿出來兩個球 2 如果是兩個同色的球,就再放入乙個黑球 3 如果是兩個異色的球,就再放入乙個白球 思路1 找規律 使用 黑球個數,白球個數 來表示桶中黑球和白球的個數變動,正數表示增加,負數表示減少,根據規...