1. 问题描述:
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
示例 1:
输入: 1
输出: [7]
示例 2:
输入: 2
输出: [8,4]
示例 3:
输入: 3
输出: [8,1,10]
提示:
rand7 已定义。
传入参数: n 表示 rand10 的调用次数。
进阶:
rand7()调用次数的期望值是多少 ?
你能否尽量少调用 rand7() ?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-rand10-using-rand7
2. 思路分析:
首先调用一次rand7()可以生成1~7之间的数字,那么调用两次可以生成1-49之间的数字,但是总的可能的数字数目不是10的倍数所以我们需要剔除掉一些数字使得剩余的数字为10的倍数,我们可以剔除掉9个数字,这样40就是10的倍数,然后对这些数字进行分组,将%10相同的余数放在同一组,在写代码的时候可以减去1再对10取余这样会比较方便。调用一次rand7()的保留数字的概率为40 / 49,那么成功的概率为49 / 40,调用两次rand7()成功的概率为2 * 49 / 40,而且数字分到每一组的概率都是一样的。
3. 代码如下:
class Solution:
def rand10(self):
# 生成1-49的数字
t = (rand7() - 1) * 7 + rand7()
if t > 40: return self.rand10()
# 将余数相同的分到同一组
return (t - 1) % 10 + 1