题目
已有方法 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
}