等概率隨機函數

昨天在做練習題的時候,看到了一道設計等概率隨機函數的練習題,突然想到了之前看到過的問題,故仔細求解。


問題如下:

現有一個等概率隨機函數f5,返回1~5這5個自然數隨機一個數,需要用f5來構造f7,返回1~7這7個自然數的隨機一個數,請問f7該如何構造?


我靈光一現,這個簡單啊,f5+f5%3,OK。但是仔細想想,好像不對,f5%3中,0的概率是1/5,1和2的概率是2/5,所以整個算法產生6和7的概率,要高於產生5的概率。

仔細想了想,等概率,是不是意味着,如果我有30個數,等概率取出來,那麼我只要從這30個數中能夠讓他取到1~7的時候返回,其餘時候重新去取,不就可以了?而取1~7,是不是也就意味着取到1~21,我用這個結果%7+1就可以了,所以算法如下:

while(x < 21) {

x = 5 * (f5 - 1) + f5

}

return 1 + x%7;

取1到25個自然數等概率,然後大於21的捨棄重新去取,最後的結果模7加1,搞定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章