js(96)~470. 用 Rand7() 实现 Rand10()

力扣本题传送门

image.png

这道题已经超出了我的认知范围了,助教讲解的大树变小树,小树变大叔还能听明白,但是进而讲到 怎么实现7变10了 都完全听不懂了.然后看了解析,也是没有能够完全理解的额,找了两个思路应该是一样的,但是实现方法不一样,做参考

虽然都是不理解,至少找的方法二和方法三 比助教讲解的代码简介

方法一

/**
 * The rand7() API is already defined for you.
 * var rand7 = function() {}
 * @return {number} a random integer in the range 1 to 7
 */
//  (randX() - 1) * Y + randY()  可以生成 1~x*y之间的整数
var rand10 = function() {
    while(true){
        // 生成1-49之间的整数 为什么会想到这儿?
        let r49 = (rand7()-1)*7+rand7()
      
        if(r49 <= 40) return 1 + r49 % 10
        
        let rand9 = r49 - 40
       
        let r63 = (rand9 - 1) * 7 + rand7()
        
        if(r63 <= 60) return 1 + r63 % 10
        
        let rand3 = r63 - 60
        let r21 = (rand3 - 1)*7 + rand7()
        
        if(r21 <= 20) return 1 + r21 % 10
       
    }
};

复制代码

方法二

思路:

首先获取等概率的 1,2,3,4,5 (如果rand7()结果>5则抛弃重新来一次 根据对称性原理 1,2,3,4,5等概率)
再以50%的概率是否加上5 这样可以得到等概率的1-10

var rand10 = function() {
            // 等概率1-5
            let result = rand7()
            while(result>5) result = rand7()
            // 等概率1-6
            let temp = rand7()
            while(temp === 7) temp = rand7()
            return temp <= 3 ? result : result + 5
};
复制代码

方法三

题思路
已知rand7执行7次能得到均等的1-7,每个数的概率是1/7,那么我们可以舍去7,只要前6个,即为:
rand7执行7次,得到概率均等的1-6,每个数的概率是1/6;
由于题意要得到概率均等的1-10,不妨设rand7执行7次,得到概率均等的1-5,每个数的概率是1/5;
那么剩余的6-10也是5个数,可以通过是否+5得到;
即再次rand7,舍去一个数,剩余的3个数平分,1-3为不加5,5-7为加5;
即最终为1-5的数,每个概率1/5,是否+5,概率为1/2;

var rand10 = function () {
    let range, isAdd5;
    do {
        range = rand7();
    } while (range > 5);
    do {
        isAdd5 = rand7();
    } while (isAdd5 === 4);
    return isAdd5 < 4 ? range : range + 5;
};

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享