【Killua筆試面試題整理】由隨機函數rand7構造rand10

【試題描述】

已知有個rand7()的函數,返回1到7隨機自然數,讓利用這個rand7()構造rand10()隨機1~10。

 

【試題分析】

1)要保證rand10()在整數1-10的均勻分佈,可以構造一個1-10*n的均勻分佈的隨機整數區間(n爲任何正整數)。假設x是這個1-10*n區間上的一個隨機整數,那麼x%10+1就是均勻分佈在1-10區間上的整數。

2)接下來利用(rand7()-1)*7+rand7()構造出均勻分佈在1-49的隨機數:

首先rand7()-1得到一個離散整數集合{0,1,2,3,4,5,6},其中每個整數的出現概率都是1/7。那麼(rand7()-1)*7得到一個離散整數集合A={0,7,14,21,28,35,42},其中每個整數的出現概率也都是1/7。而rand7()得到的集合B={1,2,3,4,5,6,7}中每個整數出現的概率也是1/7。顯然集合A和B中任何兩個元素組合可以與1-49之間的一個整數一一對應,也就是說1-49之間的任何一個數,可以唯一確定A和B中兩個元素的一種組合方式,反過來也成立。由於A和B中元素可以看成是獨立事件,根據獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49。因此(rand7()-1)*7+rand7()生成的整數均勻分佈在1-49之間,每個數的概率都是1/49。

3)由於出現的每個數的出現都是相對獨立的,所以剔除41-49後剩下1-40也應該是均勻分佈。

 

【CodeBy C Language】

int rand10() {
    int x = 0;
    do {
        x = (rand7()-1)*7+rand7();
    }while(x > 40);
    return x % 10 + 1;
}

【參考資料】

http://topic.csdn.net/u/20110926/11/AD722874-BCE1-4DFE-ADE1-DC4C7C293FF2.html

http://blog.csdn.net/ljsspace/article/details/6820753


發佈了471 篇原創文章 · 獲贊 49 · 訪問量 89萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章