【发布时间】:2011-08-15 19:20:25
【问题描述】:
我需要在半径R的圆内生成一个均匀随机的点。
我意识到,只要在区间 [0 ... 2π) 中选择一个均匀随机的角度,在区间 (0 ... R) 中选择一个均匀随机的半径,我最终会得到更多的点朝向中心,因为对于两个给定的半径,较小半径中的点将比较大半径中的点更靠近彼此。
我在over here 上找到了一篇博客文章,但我不明白他的推理。我想这是正确的,但我真的很想了解他从哪里得到 (2/R2)×r 和他是如何得出最终解决方案的。
更新:在发布此问题 7 年后,我仍然没有收到关于平方根算法背后数学的实际问题的满意答案。所以我花了一天时间自己写一个答案。 Link to my answer.
【问题讨论】:
-
拒绝抽样的缺点真的很大吗?所需的预期尝试次数为 4/π ≈ 1.27,您需要超过 k 次尝试的概率为 (1-π/4)^k。对于k=20,这是 ≈ .00000000000004,对于 k=50,它大约是 10^{-34}。您可以随时接受这些赔率;你会没事的。
-
其实拒绝抽样确实提供了终止的保证。您的算法永远不会终止的可能性非常低(准确地说为零)。
-
@spex 在实践中,拒绝技术更快,因为它避免了超越函数评估的需要。
-
我想对速度差异进行一些测试,所以我实现了 sigfpe 和 btilly 推荐的方法,以及简单的拒绝技术。在 c# 中运行(使用带有恒定种子的 System.Random)我 10m 点的时间是 sigfpe: 1.17s btilly: 1.12s
-
(续)拒绝:0.52s 所有都给出了相同的平均值和标准偏差(至 3 sig. fig)。正如预期的那样,拒绝抽样的失败率为 27%(4/pi-1),因此需要的随机数比 btilly 多 27%,但比 sigfpe 少 15%。这证实了 pjs 和其他人制作的 cmets 拒绝抽样可能是最好的方法,除非随机数的生成成本非常高。
标签: math random geometry probability