在解决算法问题中我们会经常遇到要求均等概率的问题, 以leetcode 470. 用 Rand7() 实现 Rand10() 为例。
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
⚠️ 不讨论最优解,只讨论算法思路 看到均等概率的问题, 我们最先要想到转成2进制来处理,思路是让均等概率转换成均等概率出现0和1, 再由 0 和 1 ,增加位数来处理均等概率的其他数。 拆解下上面的题目 我们使用 Rand7
转成 Rand2
。让 Rand2
的返回结果均等的出现 0 和 1, 我们可以用4位二进制数来生成包含 0 ~ 15 的数。 舍弃 10~15,保留 0 到 9 ,结果加1 就是 1~ 10的随机数。
第一步转化二进制函数
Rand7()
的结果是均等概率 出现 1,2,3,4,5,6
拆解下就是 均等概率出现 1,2,3
和 4,5,6
当出现 1,2,3
的时候返回 0 ,当出现 4,5,6
的时候返回 1
declare function rand7(): number
function Rand2(): number {
return Rand7() > 3 ? 1 : 0
}
现在我们有了过渡函数 Rand2
, 那么我们使用随机生成4位二进制数那么我就会得到 一个 均等生成