圈內的隨機點

首先定義圓半徑及其中心:

var radius:Number = 100;
var center:Point = new Point(35, 70);

然後從中心生成弧度的隨機角度 :

var angle:Number = Math.random() * Math.PI * 2;

然後生成返回點的有效半徑,因此它將在給定的 radius 內部。一個簡單的 Math.random()*radius 將不會這樣做,因為通過這種分佈,產生點將在半個半徑的半圓的內圓中結束,但是該圓的平方是原始的四分之一。要建立正確的分佈,該函式應如下所示:

var rad:Number=(Math.random()+Math.random())*radius; // yes, two separate calls to random
if (rad>radius) { rad=2*radius-rad; }

該函式產生一個值,其概率函式從 0 時的 0 到最大值線性增加。之所以發生這種情況,是因為隨機值之和的概率密度函式等於所有隨機值的各個密度函式的卷積 。這是一個普通等級人物的一些擴充套件數學,但是提供了一種型別的 GIF 來繪製兩個均勻分佈密度函式的卷積函式圖形,解釋為“ 盒訊號 ”。if 運算元將結果函式摺疊到最大值,只留下鋸齒形圖形。

選擇此功能是因為位於 radius=rradius=r+dr 之間的圓形條帶的平方隨著 r 和非常小的常數 dr 的增加而線性增加,因此 dr*dr<<r。因此,在中心附近產生的點的量小於在圓的邊緣處產生的點的量相同的餘量,因為中心區域的半徑小於整個圓的半徑。總的來說,點在整個圓上均勻分佈。

現在,得到你的隨機位置:

var result:Point = new Point(
    center.x + Math.cos(angle) * rad,
    center.y + Math.sin(angle) * rad
);

要在圓上獲得隨機點(在給定半徑的圓的邊緣上),請使用 radius 而不是 rad

PS:這個例子最終因數學解釋而過載。