概率題之隨機數的生成

2021-10-08 11:28:06 字數 2645 閱讀 3020

參考

給你乙個能生成1到5隨機數的函式,用它寫乙個函式生成1到7的隨機數。 (即,使用函式rand5()來實現函式rand7())。

rand5可以隨機生成1,2,3,4,5;rand7可以隨機生成1,2,3,4,5,6,7。 rand5並不能直接產生6,7,所以直接用rand5去實現函式rand7似乎不太好入手。 如果反過來呢?給你rand7,讓你實現rand5,這個好實現嗎?

乙個非常直觀的想法就是不斷地呼叫rand7,直到它產生1到5之間的數,然後返回。 **如下:

def

rand5()

: x =2**

31while x >5:

x = rand7(

)return x

讓我們來計算一下rand5生成1 的概率是多少。上面的函式中有個while迴圈,只要沒生成1到5間的數就會一直執行下去。 因此,我們要的1可能是第一次呼叫rand7時產生,也可能是第二次,第三次,…第n次。 第1次就生成1,概率是1/7;第2次生成1,說明第1次沒生成1到5間的數而生成了6,7, 所以概率是(2/7)*(1/7),依次類推。生成1的概率計算如下:

p(x=1)

=1/7 + (2/7) * 1/7 + (2/7)^2 * 1/7 + (2/7)^3 * 1/7 + ...

=1/7 * (1 + 2/7 + (2/7)^2 + ...) // 等比數列

=1/7 * 1 / (1 - 2/7)

=1/7 * 7/5

=1/5

上述計算說明rand5是等概率地生成1,2,3,4,5的(1/5的概率)。從上面的分析中, 我們可以得到乙個一般的結論,如果a > b,那麼一定可以用randa去實現randb。其中, randa表示等概率生成1到a的函式,randb表示等概率生成1到b的函式。**如下:

def

randb()

: x =2**

31while x > b:

x = randa(

)return x

現在題目要求我們要用rand5來實現rand7,只要我們將rand5 對映到乙個能產生更大隨機數的randa,其中a > 7,就可以套用上面的模板了。 這裡要注意一點的是,你對映後的randa一定是要滿足等概率生成1到a的

我們先給出乙個組合,再來進行分析。組合如下:

5 * (rand5(

) - 1) + rand5(

)

rand5產生1到5的數,減1就產生0到4的數,乘以5後可以產生的數是:0,5,10,15,20。 再加上第二個rand5()產生的1,2,3,4,5。我們可以得到1到25, 而且每個數都只由一種組合得到,即上述**可以等概率地生成1到25。ok, 到這基本上也就解決了。

套用上面的模板,我們可以得到如下**:

def

rand7()

: x =2**

31while x >7:

x =5*

(rand5()-

1)+ rand5(

)# rand25

return x

上面的**有什麼問題呢?可能while迴圈要進行很多次才能返回。 因為rand25會產生1到25的數,而只有1到7時才跳出while迴圈, 生成大部分的數都捨棄掉了。這樣的實現明顯不好。我們應該讓捨棄的數盡量少, 於是我們可以修改while中的判斷條件,讓x與最接近25且小於25的7的倍數相比。 於是判斷條件可改為x > 21,於是x的取值就是1到21。 我們再通過取模運算把它對映到1-7即可。**如下:

def

rand7()

: x =2**

31while x >21:

x =5*

(rand5()-

1)+ rand5(

)# rand25

return x %7+

1

讓我們把這個問題泛化一下,從特殊到一般。現在我給你兩個生成隨機數的函式randa, randb。randa和randb分別產生1到a的隨機數和1到b的隨機數,a,b不相等 (相等就沒必要做轉換了)。現在讓你用randa實現randb。

通過上文分析,我們可以得到步驟如下:

def

randb()

: x =2**

31while x > b *

(a/b)

:# b*(a/b)表示最接近a且小於a的b的倍數

x = randa(

)return x % b +

1

從上面一系列的分析可以發現,如果給你兩個生成隨機數的函式randa和randb, 你可以通過以下方式輕鬆構造randab,生成1到a*b的隨機數。

randab = b * (randa - 1) + randb

randab = a * (randb - 1) + randa

C 生成隨機數 生成任意範圍內的等概率隨機數

如果讓你用c 來生成0 n 1之間的隨機數,你會怎麼做?你可能會說,很簡單,看 srand unsigned time null rand n 仔細想一下,這個結果是隨機的嗎 當然,我們不考慮rand 函式的偽隨機性 不是的,因為rand 的上限是rand max,而一般情況下,rand max並不...

按概率生成隨機數Java版本

思想什麼的可以參看http blog.csdn.net slowgrace archive 2009 03 25 4022632.aspx 如果要控制1個數落在某個區間的概率,比如要求在sngbegin和sngend之間生成乙個隨機數,這個隨機數落在sngpb和sngpe之間的概率是p 有兩種方法,...

等概率隨機數生成器

題目 假設你已經有乙個隨機數生成器,能夠以概率p生成0,概率1 p生成1,請問如何設計演算法以概率q等概率地生成0 6這七個數字中的乙個?即每個數字的概率均為q,q 1 7.我們先從簡單的情況開始考慮,假設需要生成0和1,二者概率均為q。那麼我們可以讓已有的隨機數生成器產生兩個數字,那麼產生的數字及...