算是数学问题:
现在已经给你了一个rand7(),可以随机生成一个[1,7]的数字.
现在在这个基础上面,生成随机数rand10()
int a=rand();//1,2,3,4,5,6,7 但是这里面8,9,10表达不了
int b=rand()*7;//7,14,21,28,35,42,49 这里结尾的有 1,2,3,5,7,8,9。还是不连续,而且缺少数字了
int b=(rand()-1)*7;//7,14,21,28,35,42,49 这里结尾的有0,1,2,3,5,7,8。 还是不连续
我们再去关注一下,我们当前的问题导向:我们希望生成1,2,3,4,5,6,7,8,9且等概率
我们再去盲做一下:
int b=(rand()-1)*7+rand7();//7,14,21,28,35,42,49 这里结尾的有 1,2,3,5,7,8,9。
ps:前后的两个rand7()的随机数都是随机生成的
这样就有点散射的感觉,而且个位数都有出现1,2,3,4,5,6,7,8,9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 ......
29 ......
36 ......
43 ......
然后我们此时生成了[1,49]所有的数字了
那么我们只要41~49中的数字
那么代码就很好写了:
代码如下:
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution {
public:
int rand10() {
int rand49=(rand7()-1)*7+rand7();
return rand49>40?rand10():rand49%10+1;
}
};
还有更流氓的写法:也不知道怎么想到的:
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution {
public:
int rand10() {
//先去生成一个随机数
int a=rand7(),b=rand7();
while(a==7) a=rand7();
while(b>5) b=rand7();
// //a&1?表示的是返回的是偶数
return (a&1?0:5)+b;
}
};