這種題要分兩步,第一步是“插空兒”,第二步是“篩”
1.rand7生成rand10
只要是10的倍數就好
int rand10() { int num; do{ num = (rand7() - 1) * 7 + rand7() - 1; } while(num >= 40); return num % 10 + 1; }
概率計算:
https://blog.csdn.net/excellentlizhensbfhw/article/details/81174138
再將這49個數分為兩部分, {0, 1, 2, ... , 39}和{40, 41, .., 48},如果生成的數處於第2部分,再將第二部分等概率分到第1部分,總概率 =
2.rand01生成rand6(這個是面試指南上的題目)
int rand03(){ return rand01() * 2 + rand01(); } int rand6(){ int num; do{ num = rand03() * 4 + rand03(); } while(num >= 12); return num % 6 + 1; }
第二題稍稍改改:rand01是一個以p概率產生0以1-p概率產生1的隨機函數
這個時候就需要把rand01改成等概率的rand01p
int rand01p(){ int num; do{ num = rand01(); } while(num == rand01()); return num; }
3.rand2生成rand5
int rand03(){ return (rand2 - 1) * 2 + rand2 - 1; } int rand5(){ int num; do{ num = rand03() * 4 + rand03(); } while(num > 14); return num % 5 + 1; }
2經過插空兒后無法大於5,或者說5的倍數,所以只能通過輔助的生成03這種方式再來生成一次