等概率题目 加工数字等概率、加工函数等概率

175 阅读2分钟

题目

给定一个函数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;
}