面試題-隨機生成數

題目1:已知rand7()可以產生1~7的7個數(均勻概率),利用rand7() 產 生 rand10() 1~10(均勻概率)。

解答:

產生指定範圍內的隨機數就要求指定範圍內每個數的產生概率都是相等的。
由於無法直接通過rand7()產生1-10的數,所以就要思考如何組合rand7()生成1~10n之間的數。
爲了討論方便,更符合我們平時使用的習慣,我們將rand7() - 1,就表示生成的是0~6之間的隨機數。
i = rand7() - 1, j = rand7() - 1
那麼7 * i + j 就可以看出一個7進制的數範圍爲00~66(轉換爲十進制就是0~48),而且這些7進制數的產生概率都是一樣的,每個數都是1/48,所以我們取0~39的這40個數,它們的概率也是相同的。餘10加1就實現了rand10()。
int rand10() {
    int i = rand7() - 1;
    int j = rand7() - 1;
    int num = 7 * i + j;
    if(num >= 40)
         return rand10();
    else
         return num % 10 + 1;
}



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