1. 程式人生 > >[LeetCode] 470. Implement Rand10() Using Rand7()

[LeetCode] 470. Implement Rand10() Using Rand7()

tca input 其他 defined cte cti clas nim ted


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()