已有方法 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
枚举如下:
a 1 2 3 4 5 6 7
b
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 0
4 5 6 7 8 9 0 1
5 6 7 8 9 0 1 2
6 7 8 9 0 1 2 3
7 8 9 0 1 2 3 4
去掉右上角的
6 7 8
7 8 9
8 9 0 后
每个数字的出现次数为4次,0-9的概率相同。
所以程序思路就很明了,当结果扫到右上角的时候进行递归调用,直到输出其他结果。
平均调用2.45次rand7(),这里感谢评论区指正
(
PS:解释一下为什么是2.45............拉开看
分布列如下:调用次数为1次,P=40/49;2次P=(9/49)*(40/49); 3次P=(9/49)^2*(40/49); ............N次 P=(9/49)^(n-1)*(40/49);
平均调用次数为期望==(次数*概率)求和==1*40/49+2*(9/49)*(40/49)+(9/49)^2*(40/49)+...............+n*(9/49)^(n-1)*(40/49);
求出后结果为2*49/40=2.45
)
from random import randint
class Solution:
def rand10(self):
"""
:rtype: int
"""
a = self.rand7()
b = self.rand7()
if a > 4 and b < 4:
return self.rand10()
else:
return (a + b) % 10 + 1
def rand7(self):
return randint(1, 7)
if __name__ == '__main__':
s = Solution()
print(s.rand10())
print(s.rand10())
print(s.rand10())
输出结果:
D:\Anaconda3\python.exe G:/LeeCode/470.py
5
10
8
Process finished with exit code 0
注意:
其中有不少答案是使用
int a=(rand7()-1)*7+rand7();//1-49
if(a<=40)
return a%10+1
错误点:
- num 在值为[1->49],但是值为7, 14, 21, 28, 35, 42时,出现了两次,也就是说总样本并不是49,而是55
- if 语句中的条件是想删除[41->49]这九个样本,但是样本并不是40,而是45。