[LeetCode] 470. Implement Rand10() Using Rand7()
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 that rand10 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()?
題意:用一個可以隨機生成1-7 的rand7() 做一個隨機生成 1-10的rand10()
隨機生成的數只有整數,要得到隨機的10,就得想辦法去搞到一個10的倍數的隨機數集
10的倍數的數字必須每個數都出現
7的倍數往上走就會出現
{1,2,....,7}
{2,4,....,14}
{3,6,....,21}
......等等類似的序列,這些序列的特點就是中間會產生差值,rand7()會生成1-7的隨機數
比方說 1+ rand7() 就不會產生1,
{7,14,...,49}因為必須要有前面的數字,那麽,我們改為
{0,6,12,...,42},然後我們把每個數字加0-6,也就是rand7() - 1,就可以隨機的得到0-48;
回到開頭,我們需要滿足某個10的整數倍內產生的 數是隨機的,0-48是隨機產生的,等概率
那麽 0-39 這四十個數字出現概率是等概率的,我們舍棄40-48的數字,並不會產生影響,因為我們產生的其他數字是等概率的,我們只要那40個數字
最後由於0-39 對10取余沒辦法產生10,那麽對其+1即可
class Solution extends SolBase { public int rand10() { int res = 40; while (res >= 40) { res = 7*(rand7()-1) + (rand7() - 1); } return res%10 + 1; } }
[LeetCode] 470. Implement Rand10() Using Rand7()