如何在半径为R的圆内生成随机点:
r = R * sqrt(random())
theta = random() * 2 * PI
(假设random()
统一给出0到1之间的值)
如果要将其转换为笛卡尔坐标,则可以
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
为什么sqrt(random())
呢
让我们看一下得出的数学运算sqrt(random())
。为简单起见,假设我们正在使用单位圆,即R = 1。
点之间的平均距离应该相同,无论我们距中心有多远。例如,这意味着,在圆周为2的圆的周长上,我们发现的点数是圆周为1的圆的周长的两倍。
由于圆的圆周(2πr)随r线性增长,因此,随机点的数量应随r线性增长。换句话说,所需的概率密度函数(PDF)线性增长。由于PDF的面积应等于1,最大半径为1,因此
因此,我们知道随机值的期望密度应如何。现在:当我们拥有的都是0到1之间的统一随机值时,如何生成这样的随机值?
我们使用一种称为逆变换采样的技巧
- 从PDF创建累积分布函数(CDF)
- 沿y = x镜像
- 将结果函数应用于0到1之间的统一值。
听起来复杂吗?让我插入一个带有直觉的小提示来表达直觉:
假设我们要生成一个具有以下分布的随机点:
那是
- 1/5的点均匀分布在1和2之间,并且
- 4/5的点在2到3之间均匀分布。
顾名思义,CDF是PDF的累积版本。直观地:当PDF(X)描述了随机值的数量为x,CDF(X)描述了随机值的数量小于x。
在这种情况下,CDF如下所示:
要了解它的作用,想象一下我们以均匀分布的高度从左向右发射子弹。当子弹击中线时,它们掉到地上:
看看地面上子弹的密度如何对应于我们期望的分布!我们快到了!
问题在于,对于此功能,y轴是输出,x轴是输入。我们只能“从地上直射子弹”!我们需要逆函数!
这就是为什么我们将整个事情都反映出来了。x变成y并且y变成x:
我们称之为CDF -1。为了根据所需的分布获取值,我们使用CDF -1(random())。
…因此,回到生成我们的PDF等于2 x的随机半径值。
步骤1:创建CDF:
由于我们正在处理实数,因此CDF表示为PDF的整体。
CDF(x)=∫2 x = x 2
步骤2:沿着y = x镜像CDF:
从数学上讲,这可以归结为交换x和y并求解y:
CDF: ÿ = X 2
交换: X = ÿ 2
解: Ý =√ X
CDF -1: Ý =√ X
步骤3:将结果函数应用于0到1之间的统一值
CDF -1(random())=√random()
这是我们着手得出的:-)