【问题标题】:Generate a uniformly random point within an annulus (ring) [duplicate]在环(环)内生成一个均匀随机点[重复]
【发布时间】:2012-10-15 10:04:19
【问题描述】:

可能重复:
Create random number within an annulus

我想在annulus内获得一个均匀获得的随机点,即位于半径为R1的圆内但在半径为R2的圆外的区域,其中R1 > R2和两个圆都以同一点为中心。我想避免使用拒绝抽样。

如果可能,我希望解决方案类似于this one——用于计算圆内的随机点——我觉得它非常优雅和直观。也就是说,我也想避免使用平方根

【问题讨论】:

  • 感谢编辑,不知道那个区域被称为环。 ;-)
  • 添加了说明,指出我想避免平方根(因此,不完全是另一个的重复项)。
  • 我希望将链接问题中的[0,R] 更改为[R1,R2],但我敢打赌这并不简单。还是这样?
  • 这个问题不是完全重复的。与其他问题不同,它要求(我后来提供)一个避免使用平方根的解决方案。
  • 在我看来,你们都在解决同一个问题——只是你们在解决问题时对允许的内容有额外的限制。

标签: math random geometry probability


【解决方案1】:

这很容易。使用极坐标,即为角度值 theta 生成一个随机值,为与原点的距离生成一个随机值。由于您的圈子都在同一个原点,这变得非常容易。

但是注意:您可以通过统一的随机函数生成 theta 值,这很好,但是对于您不能这样做的距离,因为那时这些点将聚集在原点周围。 您必须考虑到圆的周长在 ^2 中增长(您必须使用平方根的倒数)。

使用均匀分布的随机函数rnd (0..1) 会是这样的:

theta = 360 * rnd();
dist = sqrt(rnd()*(R1^2-R2^2)+R2^2);

编辑:为了转换成笛卡尔坐标,您只需计算:

x =  dist * cos(theta);
y =  dist * sin(theta);

【讨论】:

  • 我怀疑典型的 cossin 函数采用度数,更可能是弧度。但这是一种工作方法。
  • 如果可能的话,我想避免 sqrt() 就像我链接的答案一样。我也不想使用拒绝抽样。
  • 取决于你的功能。如果您不使用度数而是弧度,只需将 360 替换为 2*PI
  • 啊,你没有提到,你不想要sqrt。 (在链接中,他们需要额外花费一个 rnd 评估,这通常比 sqrt 更昂贵(当它是一个好的 rnd 生成器时) - 基本相同,sqrt 将单个均匀分布变量转换为正确的非均匀分布,而链接解相加两个,得到非均匀分布)。
  • 我使用 Mathematica 绘制了您的解决方案,但它看起来并不统一。在此处查看:i.imgur.com/8cc0I.png 对于统一的解决方案,请参阅其他答案:stackoverflow.com/a/9048443/269753,并在此处绘制:i.imgur.com/7L04w.png
【解决方案2】:

编辑: 请注意,此解决方案可能不统一。请参阅下面的 Mark Dickinson 的 cmets。

好吧,我想我明白了。请注意,此解决方案深受 this answer 的启发,并且 r1 = R1/R1 和 r2 = R2/R1。

伪代码:

t = 2*pi*random()
u = random()+random()
r = if u>1 then 2-u else u
r = if r<r2 then r2+r*((R1-R2)/R2) else r
[r*cos(t), r*sin(t)]

它在 Mathematica 中。

f[] := Block[{u, t, r}, u = Random[] + Random[];
r1 = 1; r2 = 0.3;
t = Random[] 2 Pi;
r = If[u > 1, 2 - u, u];
r = If[r < r2, r2 + r*((R1 - R2)/R2), r];
{r Cos[t], r Sin[t]}]

ListPlot[Table[f[], {10000}], AspectRatio -> Automatic]

它所做的是将落在内圈内的所有数字重新映射到环形空间中,并均匀地分布它们。如果有人发现此解决方案的一致性存在问题,请发表评论。

与找到的其他解决方案进行比较 here:

【讨论】:

  • 这是一个简洁的答案,但不幸的是结果并不统一。如果您尝试使用例如R2 = 0.95R1 = 1.0,您会发现靠近环外的点是受青睐的。生成合适的r的正确方法是取随机变量uvu[R2, R1]中统一选择,v[0, R2 + R1]中统一选择,然后取r = u如果v &lt; ur = R2 + R1 - u 如果 v &gt;= u.
  • 马克,感谢您的评论和替代方案。你确定我的解决方案不统一吗?正如你所建议的那样,即使在 R2=0.95 的情况下,我也不会注意到它:i.imgur.com/wmDEo.png
  • 非常肯定,是的。 :-) 这是一个你可以做的测试:取R2=0.5R1=1.0 并生成10,000 个样本(比如说)。现在通过添加一个半径为 0.75 的圆将您的环一分为二,并计算您生成的样本中有多少位于外环 (0.75
【解决方案3】:

最简单的方法是使用rejection sampling。在边长为 2*R2 的正方形中均匀生成大量点,然后将这些样本过滤到外圆内而不是内圆内。

不漂亮或不高效,但在大多数情况下,足够了。

【讨论】:

  • 他说他不想使用拒绝抽样。对于拒绝抽样,至少可以使用他所链接的方法从较大圆圈中的点统一开始。
猜你喜欢
  • 2011-08-15
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多