题目
给定一个函数f,可以1~5的数字等概率返回一个。请加工出1~7的数字等概率返回一个的函数g。
- 通过给定的区间,无效区间重算,根据有效区间的落点来构造返回0或1的函数,拿到返回0或1的函数,通过左移的位运算来构造要等概率返回的区间,无效区间重算
// 等概率返回 1-5 的函数
function f() {
return Math.floor(Math.random() * 5) + 1;
}
// 根据 1-5 区间构造返回0和1的等概率函数,构造有效区间,也就是返回1-2时为0,4-5时为1,3为无效,对于双方来说3都是无效的,只有当值落在有效区间才进行比较,而两个有效区间长度又是一样的,这样来保证概率相等
function ret01() {
let res = 0;
do {
res = f();
} while (res === 3);
return res < 3 ? 0 : 1;
}
function g() {
let res = 0;
do {
res = (ret01() << 2) + (ret01() << 1) + ret01; // 返回结果范围为 0 - 7,需要的范围为0-6,所以7的时候重新生成
} while (res == 7);
return res + 1;
}
题目
给定一个函数f,以p概率返回0,以1-p概率返回1。请加工出等概率返回0和1的函数g
- 获取(f<<1) + f的所有取值,找到相同概率下能拿到的值,不相同概率的值无效重新计算,比如f的所有取值为00、01、10、11,所以返回 00 的概率为 pp,返回01、10的概率为 p(1-p)、(1-p)p,返回11的概率为(1-p)(1-p),当返回00和11的时候无效,因为01和10的概率相同
function g() {
let res;
do {
res = p()<<1 + p();
} while (res == 0 || res == 3);
return res == 1 ? 1 : 0;
}