圈内的随机点
首先定义圆半径及其中心:
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=r
和 radius=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:这个例子最终因数学解释而过载。