C 之桶中取黑白球問題

2022-01-18 12:06:30 字數 2627 閱讀 6944

《程式設計之美》284頁,問題4.6:桶中取黑白球。

有乙個桶,裡面有白球、黑球各100個,人們必須按照以下規則把球取出來:

1. 每次從桶中拿兩個球;

2. 如果兩球同色,再放入乙個黑球;

3. 如果兩球異色,再放入乙個白球;

於是我開始分析,桶裡裝球,每次摸球是隨機的,所以不能用佇列和棧,那就用萬能的動態列表來做桶吧。按照題目描述的順序,寫出取球的過程,最後剩的是黑球返回1,白球返回2,其他情況(沒球了)返回3,然後根據概率在大資料量下將會趨於穩定的性質無限取球,最後趨於穩定的那個數就是答案。

**如下(注釋的部分為除錯程式過程中用到的測試**,用來顯示操作過程中取球、放球、以及桶中球的詳細變化過程):

using

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;}}

}

我因為不小心將一處的「whiteball」寫成了「whileball」而一度修改卻得不到正確的答案,最終一步一步的通過上面的測試**,才將出錯範圍最終鎖定在了初始化bucketballs的for迴圈內,最終發現我將「whiteball」寫成了「whileball」。改過來以後,執行結果終於正確了。下面是去掉測試**的最終版:

using

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;}}

}

通過執行結果可以看出來,概率一直很穩定,為1:

所以答案是在白球和黑球各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 找規律 使用 黑球個數,白球個數 來表示桶中黑球和白球的個數變動,正數表示增加,負數表示減少,根據規...