【隨機數應用之】在半徑為R的圓內找隨機n個點

來源:互聯網
上載者:User

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

   


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.