利用等概率Rand5產生等概率Rand3

2021-05-28 10:59:08 字數 2378 閱讀 9957

問題本身很明確,但不知道起個什麼題目好,姑且先這麼說吧。

問題描述:現在有乙個叫做rand5的函式,可以生成等概率的[0, 5)範圍內的隨機整數,要求利用此函式寫乙個rand3函式(除此之外,不能再使用任何能產生隨機數的函式或資料來源),生成等概率的[0, 3)範圍內的隨機整數。

我第一次遇到這個問題的時候,著實犯了一回傻,自以為是地證明了這個題目是無解的。其實從概率的角度來看,題目的要求就是,利用乙個1/5的概率源,通過某種方式產生出1/3的概率輸出。我們都知道,概率運算法則有加法和乘法,而在我的記憶中,演算法是「在有限步驟內求解某一問題所使用的一組定義明確的規則」,演算法的乙個重要特徵就是有窮性,即乙個演算法必須保證執行有限步之後結束。那麼有限多個1/5通過加法和乘法是不可能的到1/3這個數值的,因為加法和乘法都不會給分母帶來新的因子,那麼分母中的3根本就不可能出現。

然而我忽略了這樣乙個式子:∑∞

i=0(

25)i

=11−

25=5

3

基於這個想法,我們來看看這個演算法是什麼樣子的:

python:

1

2

3

4

5

defrand3

():

x  = -

1while not0

<= x 

<

3:

x  = rand5

()returnx

c++:

1

2

3

4

5

6

7

8

9

int rand3

()while

(x  >=3)

;return x

;}

演算法很簡單,x是我們最終要輸出的數字,只要它不在[0, 3)範圍內,就不斷地呼叫rand5來更新它。直觀地看,演算法輸出的數字只有0、1、2這三個,而且對任何乙個都沒有偏袒,那麼顯然每個數字的概率都是1/3,那讓我們來嚴格地計算一下。

以輸出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:

1

2

3

4

5

defrand7

():

x  = -

1while not0

<= x 

<

21:

x  = rand5

() * 

5 + rand5

()returnx % 

7

c++:

1

2

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 ...