5.1-2 用random(0,1)來實(shí)現(xiàn)random(a,b),并估計(jì)運(yùn)行時(shí)間.
想到一種解法,分治法:
1.分解,將a-b區(qū)間分成2部分,通過random(0,1)控制,則進(jìn)入前半部和后半部的概率是一樣的;
2.遞歸的處理前后兩個(gè)部分,若問題足夠小,即落到某個(gè)具體位置上時(shí),則直接返回;
偽代碼:
int random( a, b )
{
if( a == b )
return a;
if( random( 0, 1 ) )
return random( a, (a+b)/2 );
else
return random( (a+b)/2 + 1, b );
}
但仔細(xì)分析下發(fā)現(xiàn)有問題.
令 n = b-a, 問題簡化為 1/n = f( 1/(2^x) ),
root
/ \
0 1
/ \ / \
/ ..... \
0 ......... 1
時(shí)間復(fù)雜度為 O(lgn),通過lgn次random(0,1)調(diào)用,即生成長度為lg(b-a)的"前后后前..."隨機(jī)序列來控制最后落定的位置,類似2叉決策樹的決策過程,x次random(0,1)調(diào)用最多可能產(chǎn)生2^x條路徑,即最多可能返回2^x種結(jié)果,每條路徑的產(chǎn)生概率相等,即1/(2^x).
但如果n不是2的整數(shù)次方,不可能將概率平均分配到每條路徑,所以不可能在有限次調(diào)用內(nèi)生成精確的平均返回概率.
如, n=8時(shí),可以取x=3,正好8種返回結(jié)果的概率一樣,都是1/8.但如果n=7,那么b的返回概率可能會(huì)是2/8,其余值的返回概率均為1/8.
所以得到的結(jié)果是不精確的,上網(wǎng)查了很久,也沒找到答案 |