假設你已經有乙個隨機數生成器,能夠以概率p生成0,概率1-p生成1,請問如何設計演算法以概率q等概率地生成0-6這七個數字中的乙個?即每個數字的概率均為q,q<1/7.我們先從簡單的情況開始考慮,假設需要生成0和1,二者概率均為q。那麼我們可以讓已有的隨機數生成器產生兩個數字,那麼產生的數字及概率是:
number
prob00p
2 p
201p
(1−p
) p(1
−p
)10p
(1−p
) p(1
−p
)11(
1−p)
2 (1−
p)
2注意到01和10的概率是相等的,所以可以當得到01時輸出0,得到10時輸出1,並令p(1-p)=q, 可以求得p的值,顯然p有兩個關於1/2的對稱解,從直觀上來理解這也是必然的,因為0和1是對稱的。
這種解法可以推廣到n個數的情況,生成的00…001對應0,00…010對應1,00…100對應2,……,01…000對應n-1,10…000對應n。同樣令pn
−1(1
−p)=
q pn−
1(1−
p)=q
即可求得p的值。
參考文獻:
隨機數相關面試題
1 給你乙個陣列,設計乙個既高效又公平的方法隨機打亂這個陣列 此題和洗牌演算法的思想一致 方法比較簡單,基本思想是每次隨機取乙個數,然後把它交換到最後的位置。然後對前 n 1 個數使用遞迴的演算法。遞迴實現 void suffle int a,int n 非遞迴實現 void suffle int ...
隨機數相關面試題
1 給你乙個陣列,設計乙個既高效又公平的方法隨機打亂這個陣列 此題和洗牌演算法的思想一致 方法比較簡單,基本思想是每次隨機取乙個數,然後把它交換到最後的位置。然後對前 n 1 個數使用遞迴的演算法。遞迴實現 void suffle int a,int n 非遞迴實現 void suffle int ...
一道面試題 等概率隨機數
假設有兩個函式 rand3 可以產生隨機的0 1 2,rand5 可以產生隨機的0 1 2 3 4,現在請你利用它編寫乙個函式rand7 產生0 6的隨機數。int rand7 int row,col do while a row col 6 return a row col int rand7 w...