这道题已经超出了我的认知范围了,助教讲解的大树变小树,小树变大叔还能听明白,但是进而讲到 怎么实现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