圆内随机点生成

在一个以原点为圆心的圆随机生成均匀分布的点

方法1:

x^2 + y^2 = R^2
x \in [-R, R], y \in [-R, R]
根据圆的表达式,我们可以很容易想出随机生成定义域内的x和y,如果在圆内,则符合要求。

缺点:在圆外的点过多,消耗过大,随机生成一个有效点的概率为π/4

注意:

可能有小伙伴会想通过随机生成x后,再用表达式推导出y,此时y的取值范围:
y \in [-\sqrt {R^2 - X^2}, \sqrt{R^2 - X^2}]
这样虽然解决了消耗过大的问题,但是算法失去了正确性。我们可以注意到的是,x在靠近R或-R的时候y的取值范围就会越来越小。通过图像反应:就是x靠近R或-R的时候点会比较密集。

方法2:

\begin{cases} x = r * cos(\theta) \\y = r * sin(\theta) \end{cases} ({\theta} \in [0, 2π],r \in [0, R])

根据圆的极坐标表达式,最直接的想法是在[0, 2π]的区间取个弧度值θ和[0, R]离圆心的距离r就可以生成一个园内的点。

验证是否满足均匀分布的要求?

先说结论,点离圆r心越近越密集,离圆心越远越稀疏。解释:由于r的取值范围在[0, R]之间,所以同一r生成的点的数量是相同,但是圆的半径会变大,同样数量的点就会显得稀疏,这样就造成圆心密集边缘稀疏的问题。

如何解决?

只要解决好面积增长与距离增长成正比,不均匀的问题迎刃而解。
\begin{cases} x = \sqrt r * cos(\theta) \\y = \sqrt r * sin(\theta) \end{cases} ({\theta} \in [0, 2π],r \in [0, R^2])

令r的取值范围为[0, R^2],这样点就能在圆内均匀分布了。

对比起方法1是更优的解法,没有多余的消耗。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容