我需要在半径R 的圆内生成一个均匀随机点。
我意识到,只需在区间 [0 … 2×) 中选择一个均匀随机的角度,并在区间 (0 … R ) 中选择一个均匀随机的半径,我最终会得到更多指向中心的点,因为对于两个给定半径,较小半径中的点将比较大半径中的点更靠近彼此。
我在这里找到了一个关于此的博客条目,但我不明白他的推理。我想这是正确的,但 我真的很想了解他从哪里得到 (2/ R 2 )× r 以及他是如何得出最终解决方案的。
更新: 发布这个问题 7 年后,我仍然没有收到关于平方根算法背后数学的实际问题的满意答案。所以我花了一天时间自己写一个答案。
r = R * sqrt(random()) theta = random() * 2 * PI
(假设random()统一给出一个介于 0 和 1 之间的值)
random()
如果要将其转换为笛卡尔坐标,可以执行
x = centerX + r * cos(theta) y = centerY + r * sin(theta)
sqrt(random())
让我们看看导致sqrt(random()). 为简单起见,假设我们使用单位圆,即R = 1。
无论我们看起来离中心多远,点之间的平均距离都应该相同。这意味着,例如,在周长为 2 的圆的周长上,我们应该找到的点数是周长为 1 的圆周长上的点数的两倍。
![img](https://i.stack.imgur.com/lAyvB.png)
由于圆的周长 (2π r ) 随r线性增长,因此随机点的数量应随r线性增长。换句话说,所需的概率密度函数(PDF) 线性增长。由于 PDF 的面积应该等于 1,最大半径是 1,所以我们有
![img](https://i.stack.imgur.com/WI9F7.png)
所以我们知道我们的随机值的期望密度应该是什么样子。现在:当我们只有一个介于 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())。
假设我们要生成一个具有以下分布的随机点:
那是
顾名思义,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: y = x 2 交换: x = y 2 求解: y = √ x CDF -1: y = √ x
第 3 步:将结果函数应用于 0 和 1 之间的统一值
CDF -1 (随机()) = √随机()
这就是我们打算得出的:-)