LeetCode 470. Implement Rand10() Using Rand7()
阿新 • • 發佈:2018-11-09
題意:已知一個函式可以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; } } } };