用 Rand7() 实现 Rand10()
给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。
你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。
每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。
示例 1:
输入: 1
输出: [2]
示例 2:
输入: 2
输出: [2,8]
示例 3:
输入: 3
输出: [3,8,10]
思路:
这道题要求用给定的rand7()来构造rand10()函数,其实就是一个数学问题了,我们记住一些特别的结论和公式就可以了。
不过为了方便理解,我们先一步一步来推导如何用rand7得到rand10:
① 已知 rand7()可以等概率生成1~7;
②那么rand7()-1可以等概率生成0~6;
③那么(rand7()-1)*7可以等概率生成{0, 7, 14, 21, 28, 35, 42};
④那么(rand7()-1)*7+rand7()可以等概率生成1~49。
这是因为(rand7()-1)*7+rand7() ==>{0, 7, 14, 21, 28, 35, 42}+rand7()==>{0+rand7(), 7+rand7(), 14+rand7(), 21+rand7(), 28+rand7(), 35+rand7(), 42+rand7()},也就是{1~7,8~14,15~21,22~28,29~35,36~42},也就是1~49。
现在我们实现了等概率生成1~49的功能,我们规定如果生成的数大于40,我们就重新生成,即只要生成在1~40之间的数,这一我们就可以生成1~40的等概率分布。
再接着,我们用(1~40)%10,就可以得到0~9。(这里很好理解吧,因为(1~10)%10会得到0~9,(11~20)%10也会得到0~9,(21~30)%10和(31~40)%10依然会得到0~9)所以不管是1~几十,%10操作后都会得到0~9。
最后,(1~40)%10 + 1 ,就可以得到1~10了。
因此我们有结论:
如果randx()表示可以生成1-x之间的随机整数,则:(randX() - 1)*Y + randY() 可以等概率的生成[1, X*Y]范围的随机数。
当我们拿到型如“1~20”,“1~40”这样整10范围的时候,通过%10再+1的方式就可以得到1~10的随机分布了。
有了结论,代码实现起来就非常简单了。
代码:
class Solution(object):
def rand10(self):
s = 41#初始化s,随便给一个大于40的数,让函数进入随机生成代码
while s>40:#当s大于40就再次生成
s = (rand7() ~ 1) * 7 + rand7() #结论
#此时s符合(1~40)
s = s%10+1 #(1~40)%10 +1 ,就可以得到1~10了。
return s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了