Given a function rand7
which generates a uniform random integer in the range 1 to 7, write a function rand10
which generates a uniform random integer in the range 1 to 10.
Do NOT use system's Math.random()
.
Example 1:
Input: 1
Output: [7]
Example 2:
Input: 2
Output: [8,4]
Example 3:
Input: 3
Output: [8,1,10]
Note:
rand7
is predefined.- Each testcase has one argument:
n
, the number of times thatrand10
is called.
Follow up:
- What is the expected value for the number of calls to
rand7()
function? - Could you minimize the number of calls to
rand7()
?
class Solution extends SolBase { public int rand10() { int i,j; while( (i = rand7()) > 6); // P(i is even) = P(i is odd) = 0.5 while( (j = rand7()) > 5); // P(j==1) = P(j==2) = P(j==3) = P(j==4) = P(j==5) = 0.2 return i % 2 == 0 ? j : j + 5; } }
阴间方法??居然是brain teaser
想一下要random get 1-10,给的条件只有random get 1-7,怎么办?
上面的方法是平等的拿到奇偶数(如果i是7就继续循环,反正得到1-6就可以了,而123456奇偶概率相等),然后再平等的拿到1-5(如果j是6,7就循环,直到得到12345(概率相等)就停止),然后如果even和odd各返回1-5 和 6-10 屮