用 Rand7() 实现 Rand10()

470. 用 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

posted @   JunanP  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示