470. leetcode题目讲解(Python):用 Rand7() 实现 Rand10()

题目如下:


用 Rand7() 实现 Rand10()

首先需要注意的是,数字1-10应该具有相同的生成概率。由于我们只能使用rand7函数,所以思路必然是组合使用rand7函数。

如果假设:

a = rand7()
b = rand7()

那么通过 x = a + (b - 1) * 7 可以获取数字 1 到 49:

[[ 1.  8. 15. 22. 29. 36. 43.]
 [ 2.  9. 16. 23. 30. 37. 44.]
 [ 3. 10. 17. 24. 31. 38. 45.]
 [ 4. 11. 18. 25. 32. 39. 46.]
 [ 5. 12. 19. 26. 33. 40. 47.]
 [ 6. 13. 20. 27. 34. 41. 48.]
 [ 7. 14. 21. 28. 35. 42. 49.]]

对于数字x: 1---40,我们可以通过 (x - 1) % 10 + 1 来均等的生成1到10 的整数:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

可以看到,每个数都出现了4次。对于41 --- 49,比较简单的处理方式是直接抛弃。 直到获取的数字是1到40为止。 每次运行程序会生成1到40的概率p为: 40/49, 根据独立事件的期望公式Ex = np, 程序运行的期望运行次数为n为 1.225,每次运行会调用2次rand7函数,所以rand7函数的调用次数期望为 2.45。

参考代码如下:

# Created by Jedi.L
# The rand7() API is already defined for you.
# def rand7():
# @return a random integer in the range 1 to 7

class Solution:
    def rand10(self):
        """
        :rtype: int
        """
        idx = 49
        while idx > 40:
            row = rand7()
            col = rand7()
            idx = row + (col - 1) * 7
            if idx <= 40:
                return 1 + (idx - 1) % 10

源码地址:
https://github.com/jediL/LeetCodeByPython

其它题目:[leetcode题目答案讲解汇总(Python版 持续更新)]
(https://www.jianshu.com/p/60b5241ca28e)

ps:如果您有好的建议,欢迎交流 :-D,
也欢迎访问我的个人博客 苔原带 (www.tundrazone.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这一期,与大家一起学习部分撇的写法(因为撇的不同形态比较多,写法上容易出现的问题情况也较多,故而本期只有“部分”)...
    一只笨蛋阅读 2,437评论 1 12
  • 作用:析构函数,帮助我们来进行废弃对象的内存回收机制。 1:只能对类使用析构函数,一个类也只能有一个析构函数。 2...
    辣个男人OvO阅读 349评论 0 0
  • 由于蛋挞皮的制作不划算,所以选择直接从网上购买的蛋挞皮,我们在这里只制作蛋挞液 配方:1、蛋奶油 215g、白糖 ...
    时光可见阅读 462评论 0 0
  • 在进入阿卡西记录后,我问今天应该去赴宴吗?回答:你自己感觉好就去,尊重自己 我感觉不好,但我不去的话,是不是就是不...
    蝴蝶华舞阅读 319评论 0 1