問題一:
已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,現在要你構造乙個發生器,使得它構造0和1的概率均為1/2;
構造乙個發生器,使得它構造1、2、3的概率均為1/3;…,
構造乙個發生器,使得它構造1、2、3、…n的概率均為1/n,要求複雜度最低。
解決方法:
原始的隨機數生成器,生成0 的概率為p,生成1的概率為1-p,那麼怎麼構造才能使得生成0和1的概率相等呢。或者說有兩個獨立的事件的概率是相等呢?
這樣來做一下,讓該隨機數生成器生成兩個數,那麼序列是00,01,10,11概率分別為 p*p,p(1-p),(1-p)p,(1-p)*(1-p)
很明顯,這四種情況中存在兩個獨立的事件概率是相等。也就是01和10,那麼我把01看成是0,10看成是1,那麼他們輸出的概率均為p(1-p),其他的情況捨棄。這樣就得到了0和1均等生成的隨機器了。
這種解法可以推廣到n個數的情況,我們知道,取n個隨機數發生器,存在n個概率相同的獨立事件,我們只使用這n個事件就得到1/n的概率了。例如n=3,有8中情況000,001,010,011,100,101,110,111,其中001,010,100的概率都是p^2*(1-p)。
問題二:已知有個rand7()的函式,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10。
解決方案:這個問題和上個問題不同的是,這裡產生的序列,要變成和的形式或者其他的形式,那麼概率就會發生變化了。
如果能夠得到一組等概率的數,不管是什麼數,只要等概率而且個數大於10,那麼問題就可以解決了。
發現(rand7()-1)*7+rand7(),可以等概率的生成1到49。
呵呵,這不就得了,只要把11-49砍掉就可以了。不過這樣的效率比較低。可以砍掉41-49,然後在把1-40對映到1-10(例如模10),那麼問題也就解決了。
問題三:呼叫random(0, 1)實現random(a, b)
解決方案:這裡的random(0, 1)是指等概率產生0或1,顯然,random(a, b) = a + random(0, b-a)
可以這樣做:
1,取 n=b-a+1,取最小的正整數m,使得 2^m >= n
2,呼叫random(0,1),輸出m-bit位整數n ( n >= 0 and n <= 2^m-1)
3, if n >=0 and n <= b-a
then return a+n
else 重新執行步驟 2
附:// 問題一**實現
intmyrand()
//問題三的一種遞迴實現,n不是2的冪時有誤差
intrandom( a, b )
1. csdn_geekster-一些常見的概率生成器的題目
2. csdn_chfe910-[面試題][數學與概率]設計隨機數生成器
3. csdn_shenyounger-通過有偏概率0/1生成器,生成無偏概率0/1生成器
4. -用random(0,1)來實現random(a,b),並估計執行時間.
等概率生成器
假設生成0的概率是p,生成1的概率是1 p,則生成01和10的概率相等。隨機生成0 1 int rand z one 等概率生成0 1即概率為0.5 int newrand int n1 rand z one int n2 rand z one if n1 0 n2 1 return 1 if n1...
生成器面試題之二
l for i in xrange 10 print ll a for i in xrange 10 a num i print l 輸出結果 python 第一段 解答 以上兩段 的本質區別是第乙個是直接傳物件,第二個是傳物件的引用。第一段 給列表新增,是直接新增字典物件,for迴圈中每次新增的物...
面試題 數學與概率 設計隨機數生成器
假設你已經有乙個隨機數生成器,能夠以概率p生成0,概率1 p生成1,請問如何設計演算法以概率q等概率地生成0 6這七個數字中的乙個?即每個數字的概率均為q,q 1 7.我們先從簡單的情況開始考慮,假設需要生成0和1,二者概率均為q。那麼我們可以讓已有的隨機數生成器產生兩個數字,那麼產生的數字及概率是...