此题是9.5日的每日一题,还是挺有趣的。一开始想的是利用两个随机数进行操作,然后获取结果进行一些操作,但是关键难度在于如何构造这个操作,其中需要一些技巧。后来看了题解,发现用二进制的方法来的更加直观巧妙,这里来贴一下我写的代码,顺便理一下思路。
我们的主要思路就是构造0、1的二进制序列。因为我们要生成1-10的数据,而数据10的二进制位为1010,数据1的二进制位0001,所以我们只要保证随机生成的0或者1是等概率的即可,这里就可以利用rand7()来进行生成01,当rand7生成的在1-3范围内,就为0,在4-6之内,就位1即可。
代码如下:
/**
* 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() {
int res=1;
while(true){
res = (rand_01()<<3) + (rand_01()<<2) + (rand_01()<<1) + rand_01();
if(res>=1 && res<=10) break;
}
return res;
}
//生成一个等概率01的数据
public int rand_01(){
int res=0;
int tmp=1;
while(true){
tmp = rand7();
if(tmp==7) continue;
else{
if(tmp>=1 && tmp<=3) res=0;
else if(tmp>=4 && tmp<=6) res=1;
break;
}
}
return res;
}
}