利用rand7()構造rand10()


題意

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

參考代碼

int rand7()
{
    srand((int)time(NULL)); //參考     return rand()%7 + 1;
}
int rand10()
{
    int x;
    do 
    {
        x = (rand7()-1) * 7 + rand7();
    }while(x > 40);
    return x % 10 + 1;
}

解析

要保證rand10()均勻生成1~10的隨機數,可以構造一個0~10n的隨機數區間,這樣通過rand10n()%10+1就是所求。

現在目標轉移到生成rand10n()。如果不能生成正好rand10n(),可以通過生成rand10n+m()通過舍棄多余的m來獲得rand10n()。

現在目標轉移到生成rand10n+m()。

一個可行的方法

rand7()               得到隨機數{1,2,3,4,5,6,7}
rand7()-1             得到隨機數{0,1,2,3,4,5,6}           -------集合A
(rand7()-1)*7         得到隨機數{0,7,14,21,28,35,42}      -------集合B                        
(rand7()-1)*7+rand7() 得到隨機數{0,7,14,21,28,35,42}+{1,2,3,4,5,6,7}

由於A和B中元素可以看成是獨立事件,根據獨立事件的概率公式P(AB)=P(A)P(B),得到每個組合的概率是1/7*1/7=1/49,生成概率集合為1~49。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM