rand7生成rand10,rand1生成rand6,rand2生成rand5(包含了rand2生成rand3)


這種題要分兩步,第一步是“插空兒”,第二步是“篩”

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部分,總概率 = p = \frac{\frac{40}{49}*\frac{1}{40}}{\frac{40}{49}*\frac{1}{40} + \frac{9}{49}} = \frac{1}{10}

 

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這種方式再來生成一次


免責聲明!

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



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