https://leetcode-cn.com/problems/implement-rand10-using-rand7/
思路:有意思的题目。直接用加法、乘法、取模得到的结果是不对的,原因是通过运算得到的结果可能有多种组合形式,就拿加法而言,
2
=
1
+
1
2=1+1
2=1+1,但是
3
=
1
+
2
=
2
+
1
3=1+2=2+1
3=1+2=2+1,显然每个数字出现的概率是不一样的,当然我们可以使用出现概率相同的数字来计算,这样也可以保证正确性。不过还有一种更加简单的方法,我们认为每次随机取得的数都是独立的,那么经过两次随机后,我们得到了两个数
(
x
,
y
)
(x,y)
(x,y),把它们减1后当作7进制的2位,显然取值范围为
[
0
,
48
]
[0,48]
[0,48],且它们都是等概率的,然后就可以寻找
[
1
,
10
]
[1,10]
[1,10]和这些数的对应关系了,可以让
0
、
10
、
20
、
30
0、10、20、30
0、10、20、30对应
1
1
1,
1
、
11
、
21
、
31
1、11、21、31
1、11、21、31对应
2
2
2……也可以让
0
、
1
、
2
、
3
0、1、2、3
0、1、2、3对应
1
1
1……
class Solution {
public:
int rand10() {
int x,y,ans;
do{
x=rand7();
y=rand7();
ans=(x-1)*7+y-1;
}while(ans>=40);
return ans/4+1;
}
};