問題本身很明確,但不知道起個什麼題目好,姑且先這麼說吧。
問題描述:現在有乙個叫做rand5的函式,可以生成等概率的[0, 5)範圍內的隨機整數,要求利用此函式寫乙個rand3函式(除此之外,不能再使用任何能產生隨機數的函式或資料來源),生成等概率的[0, 3)範圍內的隨機整數。
我第一次遇到這個問題的時候,著實犯了一回傻,自以為是地證明了這個題目是無解的。其實從概率的角度來看,題目的要求就是,利用乙個1/5的概率源,通過某種方式產生出1/3的概率輸出。我們都知道,概率運算法則有加法和乘法,而在我的記憶中,演算法是「在有限步驟內求解某一問題所使用的一組定義明確的規則」,演算法的乙個重要特徵就是有窮性,即乙個演算法必須保證執行有限步之後結束。那麼有限多個1/5通過加法和乘法是不可能的到1/3這個數值的,因為加法和乘法都不會給分母帶來新的因子,那麼分母中的3根本就不可能出現。
然而我忽略了這樣乙個式子:∑∞
i=0(
25)i
=11−
25=5
3
基於這個想法,我們來看看這個演算法是什麼樣子的:
python:
1c++:2
3
4
5
defrand3
():
x = -
1while not0
<= x
<
3:
x = rand5
()returnx
1演算法很簡單,x是我們最終要輸出的數字,只要它不在[0, 3)範圍內,就不斷地呼叫rand5來更新它。直觀地看,演算法輸出的數字只有0、1、2這三個,而且對任何乙個都沒有偏袒,那麼顯然每個數字的概率都是1/3,那讓我們來嚴格地計算一下。2
3
4
5
6
7
8
9
int rand3
()while
(x >=3)
;return x
;}
以輸出0為例,看看概率是多少。x的第乙個有效數值是通過rand5得到的。rand5返回0的概率是1/5,如果這事兒發生了,我們就得到了0,否則只有當rand5返回3或4的時候,我們才有機會再次呼叫它來得到新的資料。第二次呼叫rand5之後,又是有1/5的概率得到0,2/5的概率得到3或4導致迴圈繼續執行下去,如此反覆。因此概率的計算公式為:p=
====
15+2
5×(1
5+25
×(15
+25×
(⋯))
)15×
∑∞i=
0(25
)i15
×11−
2515
×531
3
喏,計算表明,rand3輸出0的概率確實是1/3,對於另外兩個數字也是一樣的。
那麼這段**是不是乙個演算法呢,它是否滿足演算法的有窮性呢?我不能確定,雖然它不停機的概率是0,然而這個概率是乙個極限值,唉,回去複習極限知識先。
改變一下題目,如果要求利用rand5編寫rand7怎麼辦?很簡單,用兩個rand5可以拼出rand25,然後就用前面的方法即可:
python:
1c++:2
3
4
5
defrand7
():
x = -
1while not0
<= x
<
21:
x = rand5
() *
5 + rand5
()returnx %
7
12
3
4
5
6
7
8
9
int rand7
()while
(x >=21)
;return x
%7;}
演算法 rand5 產生rand7
一點心青 前兩天,睡覺前,偶爾翻起演算法導論,看到隨機函式這一塊內容,裡面有乙個練習題 5.1 2 描述random a,b 過程的一種實現,它只呼叫random 0,1 作為a和b的函式,你的程式的期望執行時間是多少?注 random a,b 為產生a,a 1,a 2,b的函式發生器,且產生各整數...
演算法題 rand5 產生rand7
前兩天,睡覺前,偶爾翻起演算法導論,看到隨機函式這一塊內容,裡面有乙個練習題 5.1 2 描述random a,b 過程的一種實現,它只呼叫random 0,1 作為a和b的函式,你的程式的期望執行時間是多少?注 random a,b 為產生a,a 1,a 2,b的函式發生器,且產生各整數的概率相等...
等概率放球
題目 有乙個機器按自然數序列的方式吐出球 1號球,2號球,3號球,你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候 n k 你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k n frac nk ...