題意
已知有個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。