[路飞]_用 Rand7() 实现 Rand10()

244 阅读1分钟

470. 用 Rand7() 实现 Rand10()

题目

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。

不要使用系统的 Math.random() 方法。

示例1

输入: 1
输出: [7]

示例2

输入: 2
输出: [8,4]

题解

二进制

用rand7可以构建出一集均匀随机返回0和1的函数,因为rand7返回[1,7];
构造一个新函数,函数名为r01;调用rand7得到数值小于4,r01返回0,大于4函数r01返回1;等于4函数r01重新执行

上述思路得到一个均匀返回0,1的函数;

利用0-1的函数,将需要生成的范围放在二进制中,本题需要找到[1,10];

二进制需要4位能表达到[0,15]; 调用4次r01函数构造4位二进制数;当得到的4位二进制数大于9时,重新调用4次r01函数构造4位二进制数;直到函数返回[0,9]区间的数;+1返回即可得到[1,10]之间的数

代码

var rand10 = function () {
  function r01() {
    let r = 0
    do {
      r = rand7()
    } while (r === 4)
    return r < 4 ? 0 : 1
  }
  let result = 0
  do {
    result = (r01() << 3) + (r01() << 2) + (r01() << 1) + r01()
  } while (result > 9)
  return result + 1
}