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

LeetCode 470. Implement Rand10() Using Rand7()

題意:已知一個函式可以uniformly randomly產生1-7,由此構造一個函式可以uniformly randomly產生1-10。

首先rand7()+rand7()%4無法保證uniform,因為rand7()%4產生的0-3的概率就不是uniform的。這可以把rand7()和rand7()%4產生的所有組合列出來看一下,看看每個sample出現次數是否相等。

用兩個rand7()進行加減操作,將1-10 map到一個Discrete space中且sample出現的次數相等。可以構造x(rand7()-1)+rand7(),因為還需要保證1,2,...,7出現,所以前面一項需要有一定的概率出現0,前面一項=1時,總和不能和1,...,7重合,所以x*1+1=8,then x=7.所以構造7*(rand7()-1)+rand7()即可。

另外,7*(rand7()-1)+rand7()產生的序列是1,2,...,49,mod 10的話,41-49是隻能包括1-9,無法保證1-10每個都出現一次,是多餘的,所以如果產生了41-49的數就要skip,重新random。這就相當於re-scale了probability,mask了invalid sppearance (41-49),所以仍然是uniform的。這種方法也叫rejection sampling。

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7

class Solution {
public:
    int rand10() {
        while(true)
        {
            int tmp=7*(rand7()-1)+rand7();
            if(tmp<=40)
            {
                return tmp%10+1;
            }
        }
    }
};