已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
/**
* The rand7() API is already defined in the parent class SolBase.
* public int rand7();
* @return a random integer in the range 1 to 7
*/
class Solution extends SolBase {
public int rand10() {
//方法2:不停的用(rand7()-1)*7+rand7()这个公式三次 ,直到最后只有 r=21这种情况需要再次循环
while(true){
int r=(rand7()-1)*7+rand7();
if(r<=40) return 1+r%10;
r=(r-40-1)*7+rand7();
if(r<=60) return 1+r%10;
r=(r-60-1)*7+rand7();
if(r<=20) return 1+r%10;
}
}
//方法1:最慢,用一次(rand7()-1)*7+rand7()这个公式
// public int rand10() {
// int r=(rand7()-1)*7+rand7();
// while(r>10){
// r=(rand7()-1)*7+rand7();
// }
// return r;
// }
//方法2:不停的用(rand7()-1)*7+rand7()这个公式 ,递归方式
// public int rand10() {
// // (rand7()-1)*7+rand7() [0,1,2,3,...6] [1,49] [41,42....49]-40-1=[0,1,2,3...8]
// //[0,1,2,3...8]*7+rand7() [0,7....56]+[1,2,....7] [1.....63]-60-1=[0,1,2]*7+[1,2...7] =[1,....21]
// int r=(rand7()-1)*7+rand7();
// if(r<=40){ //[1,...40]
// return r%10+1;
// }else{
// r=(r-40-1)*7+rand7();
// if(r<=60){
// return r%10+1;
// }else{
// r=(r-60-1)*rand7()+rand7();
// if(r<=20) return r%10+1;
// else return rand10();
// }
// }
// }
}