演算法題 rand5 產生rand7

2021-09-26 02:21:21 字數 2301 閱讀 1083

前兩天,睡覺前,偶爾翻起演算法導論,看到隨機函式這一塊內容,裡面有乙個練習題.

5.1-2 描述random(a,b)過程的一種實現,它只呼叫random(0,1).作為a和b的函式,你的程式的期望執行時間是多少?

注:random(a,b)為產生a,a+1,a+2,...,b的函式發生器,且產生各整數的概率相等,同為1/(b - a + 1).

看到這個題目時,似曾相識,腦海浮現了利用random(0,1)產生0或1,從而組成二進位制數,來完成random(a,b)的實現.但是細想以後,感覺有個問題在腦海中有點不明不白.

執行random(0,1)函式k次,使得2k>=(b-a+1),將得到[0,2k)的整數區間,如何將[0,2k)對映到[a,b]的整數區間,保證產生各整數的概率相等,同為1/(b-a+1).

1.當存在k使得2k=(b-a+1)時,只需將產生的二進位制數與[a,b]整數一一對應,即可滿足概率同為1/(b-a+1)的要求.

例如,random(3,6),k=2. 此時,對應關係可為00~3,01~4,10~5,11~6.產生的概率為1/4.

2.當不存在k使得2k=(b-a+1)時,產生[0,2k)區間整數的概率為1/2k,小於1/(b-a+1).[0,2k)如何對映到[a,b]整數區間.

思路一:擴大[0,2k)區間,使得2k可以被(b-a+1)整除,這樣可以把[0,2k)分成n段時,每一段對應[a,b]裡的乙個整數.

但這個思路,是不可行的,因為不存在這樣的k值.要麼2k=(b-a+1),要麼2k>(b-a+1)且不可被(b-a+1)整除.

思路二:參取截斷對映,即 [0,2k) 的前部分對映到[a,b],這樣雖然可以達到產生整數的概率相等,但不等於1/(b-a+1),還有如果產生[0,2k)後部分的值如何處理.

這個思路,是可行的,如果產生後部分的值,就繼續呼叫自身,重新random.從結果輸出分析,最終random(a,b)最終輸出的只有[a,b]裡的整數,而且每個整數的概率相等,因而其產生的概率值是1/(b-a+1).

具體的實現**如下:

int random(int a,int

b) m = 0

;

for(int i = 0;i < k;i++)

if(m + 1 >len)

else

}

由於冗餘的存在,該方法執行時間最壞的情況是無究,就是無限地遞迴呼叫自身.執行時間的下限是o(log(b-a+1)).

由上述的練習題可擴充套件出更多類似的問題.

利用rand5()產生rand7().rand5()產生1到5的整數,rand7()產生1到7的整數.

解決思路與上述的練習題是一樣的.利用rand5()產生的乙個整數空間,然後將其對映到[1,7]的整數空間上,對映時保證概率相等,且等於1/7.

下面介紹幾個有意思的實現.

1.利用預置陣列該方法簡單,易理解,但是不具擴充套件性,需要額外儲存空間.

1

intrand7()2,

5 ,

6 ,

7 ,

8 9};

10int result = 0;11

while(result == 0)12

17return

result;

18 }

2.常規實現方法可擴充套件,主要分為三步,構造大的整數區間,限制整數區間,最後對映整數區間.

1

intrand7()

2while(i > 21); //

將[1,25]整數區間控制於[1,21]

7return i%7 + 1; //

將[1,21]對映到[1,7]

8 }

3.看似正確的方法 其實錯誤的方法

1

intrand7()

2

與方法2的思路一樣,構造新的整數區間,但是方法3中構造的整數區間並不是等概率的.

第4**中,將會產生5^7種可能的計算,但最終這些可能對映到[7,35]的整數區間中,但是[7,35]區間內整數的產生的概率並不相等.

例如,通過累加區間[0,1]三次,可以得到[0,3]的區間,但是[0,3]每個整數的概率並不相等,分別為1/8,3/8,3/8,1/8.

演算法 rand5 產生rand7

一點心青 前兩天,睡覺前,偶爾翻起演算法導論,看到隨機函式這一塊內容,裡面有乙個練習題 5.1 2 描述random a,b 過程的一種實現,它只呼叫random 0,1 作為a和b的函式,你的程式的期望執行時間是多少?注 random a,b 為產生a,a 1,a 2,b的函式發生器,且產生各整數...

演算法 根據Rand5 函式構造生成Rand7

給定乙個函式rand5 該函式可以隨機生成1 5的整數,且生成概率一樣。現要求使用該函式建構函式rand7 使函式rand7 可以隨機等概率的生成1 7的整數。當看到這道題的時候,第乙個想法就是 利用rand5 rand5 3 來解決 但是這樣得出的結果不是題目所要求的等概率的,這種情況下rand5...

一道題 由rand5 實現rand7

程式設計題目 已知有乙個函式rand 可以生成1 5之間的整數隨機數,其結果每個數的概率均勻分布,嘗試寫出乙個可以生成1 7之間的整數隨機數的函式,且每個數均勻分布。解法 題目需要乙個能夠獲得1 7之間整數的函式,並且得到每個數的概率都是嚴格的1 7。如果只是得到1 7的話很簡單,例如 rand r...