【路飞】算法与数据结构-用 Rand7() 实现 Rand10()

105 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

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

示例 1:

输入: 1
输出: [7]

示例 2:

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

示例 3:

输入: 3
输出: [8,1,10]

提示:

  • rand7 已定义。
  • 传入参数: n 表示 rand10 的调用次数。

思路

首先获取等概率的 1,2,3,4,5 (如果rand7()结果>5则抛弃重新来一次 根据对称性原理 1,2,3,4,5等概率) 再以50%的概率是否加上5 这样可以得到等概率的1-10

var rand10 = function() {
            // 等概率1-5
            let result = rand7()
            while(result>5) result = rand7()
            // 等概率1-6
            let temp = rand7()
            while(temp === 7) temp = rand7()
            return temp <= 3 ? result : result + 5
};