小编典典

在圆内生成一个随机点(均匀)

all

我需要在半径R 的圆内生成一个均匀随机点。

我意识到,只需在区间 [0 … 2×) 中选择一个均匀随机的角度,并在区间 (0 … R )
中选择一个均匀随机的半径,我最终会得到更多指向中心的点,因为对于两个给定半径,较小半径中的点将比较大半径中的点更靠近彼此。

我在这里找到了一个关于此的博客条目,但我不明白他的推理。我想这是正确的,但 我真的很想了解他从哪里得到 (2/
R 2 )× r 以及他是如何得出最终解决方案的。


更新: 发布这个问题 7
年后,我仍然没有收到关于平方根算法背后数学的实际问题的满意答案。所以我花了一天时间自己写一个答案。


阅读 92

收藏
2022-05-10

共1个答案

小编典典

如何在半径为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 的圆周长上的点数的两倍。

    ![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. 从 PDF 创建累积分布函数(CDF)
  2. 沿y = x镜像
  3. 将结果函数应用于 0 和 1 之间的统一值。

听起来很复杂?让我插入一个带有小旁道的块引用来传达直觉:

假设我们要生成一个具有以下分布的随机点:

img

那是

  • 1/5 的点均匀地介于 1 和 2 之间,以及
  • 4/5 的点均匀地介于 2 和 3 之间。

顾名思义,CDF 是 PDF 的累积版本。直观地说:虽然 PDF( x ) 描述了 x 处的随机值的数量但 CDF( x ) 描述了小于 x的随机值的数量。

在这种情况下,CDF 看起来像:

img

要了解这有什么用处,请想象我们以均匀分布的高度从左到右发射子弹。当子弹击中线时,它们掉到地上:

img

看看地面上的子弹密度如何与我们想要的分布相对应!我们快要到了!

问题是对于这个函数,y轴是输出x轴是输入。我们只能“从地上直射子弹”!我们需要反函数!

这就是我们反映整个事情的原因;x变成y并且y变成x

img

我们称之为CDF -1。为了根据所需分布获取值,我们使用 CDF -1 (random())。

…所以,回到生成我们的 PDF 等于 2 x的随机半径值。

第 1 步:创建 CDF:

由于我们使用的是实数,因此 CDF 表示为 PDF 的积分。

CDF ( x ) = ∫ 2 x = x 2

第 2 步:沿*y* = *x*镜像 CDF :

从数学上讲,这归结为交换xy并求解y

CDFy = x 2
交换: x = y 2
求解: y = √ x
CDF -1: y = √ x

第 3 步:将结果函数应用于 0 和 1 之间的统一值

CDF -1 (随机()) = √随机()

这就是我们打算得出的:-)

2022-05-10