/---------------MonkeyAndy原創 轉載請註明出處------------------/
http://blog.csdn.net/MonkeyAndy
-------------------------如有錯誤,歡迎批評指正-------------------------
問題描述:
設rand(s,t)返回[s,t]之間的隨機小數,利用該函數在一個半徑為R的圓內找隨機n個點,並給出時間複雜度分析。
思路:
在半徑為R的圓內找隨機的n個點,既然是找點,那麼就需要為其建立座標系,如果建立平面直角座標系,以圓心為原點,建立半徑為R的圓的直角座標系。要使隨機的點在圓內,則必須使其所找的點 point 的x,y座標的絕對值小於R,問題轉化為:隨機的找n個圓內的點,使其x,y座標的絕對值均小於R。這裡以x為例,
首先 x 應滿足 -R<= x <= R; y同理。這樣產生的點均在以圓心為中心,邊長為2R的正放形內,需要另外判斷其距離R的值。本文介紹採用極座標的形式,建立圓的極座標系,則圓內的任意一點滿足 P(ρ,θ)(用ρ表示線段OP的長度,θ表示從Ox到OP的角度angle),此時問題轉化為:找一點,使其到圓心的距離OP大於等於0 小於R,極角大於等於0
小於360,則OP=rand(0, R) ,當 OP== R 時重新尋找,angle = rand(0,360) ,當angle==360時,重新尋找。每找到一個點p,將其與之前所找到的所有點進行比較,若重合,則繼續尋找,否則將其加入到已找到的點集合中,直到找到n個點。
存放點的資料結構
typedef struct Point{
double r;
double angle;
}Point;
演算法流程:
for( i=n ; i >0; i--)
產生 p.r = rand(0,R),且p.r != R
產生 p.rangle = rand(0,360) ,且 p.rangle != 360
遍曆所有產生的點,若 p 已經存在,則重建該點
否則將其加入到產生的點集合中
產生第n個點,需要先遍曆前n-1個點,時間複雜度為O(n),故產生n個點的時間複雜度為O(n^2)