• 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这种方式再来生成一次

  • 相关阅读:
    Java: Chain of Responsibility Pattern
    CSharp: Chain of Responsibility Pattern
    CSharp: Command Pattern
    CSharp: Proxy Pattern
    CSharp:Flyweight Patterns
    Java: Command Pattern
    C++工厂模式
    C++实现私有化PIMPL[Private Implementation]
    Qt:Using QByteRef with an index pointing outside the valid range of a QByteArray
    std::stack
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/9561443.html
Copyright © 2020-2023  润新知