在矩形内生成随机点(均匀)

时间:2011-07-30 15:08:48

标签: algorithm random geometry 2d distribution

在矩形内生成一个随机点(统一)

这假设是一个简单的问题。

然而,在RANDOM_DATA homepage中,我发现了以下注释:

  

但是,在简单的情况下,我们不会实现均匀分布   一个不等边的矩形[0,A] x [0,B],如果我们天真地缩放   随机值(u1,u2)到(A * u1,B * u2)。在那种情况下,预期   宽,短区域的点密度将不同于a的点密度   狭窄的高大地区。如果没有统一性是最明显的   绘制了点。

我发现它很奇怪......我无法弄清楚为什么这种缩放会影响均匀性。

我错过了什么?

修改

谢谢Patrick87和missingno。我正在寻找声明的理论原因。我现在明白原因不是理论上的,而是实际的 - 浮点值的粒度

如果我将在0和1之间生成两个统一的浮点(由于浮点值表示的性质,这本身就是一个问题。查看算法的here) - 粒度将是有限的。

假设在0和1之间存在X个不同的值。通过缩放(u1,u2)到(u1,2 * u2),我们将在[0,u1]范围内有X个不同的值,并且在X中有不同的值范围[0,2 * u2]。对于面积均匀性,[0,2 * u2]中的不同值应该是[0,u1]的两倍。

鉴于此,请允许我更改我的问题:

如何在矩形内生成随机点(按区域均匀分布)?

4 个答案:

答案 0 :(得分:5)

该陈述不正确,两个独立统一措施的直接产品是统一的衡量标准。这可以显示如下:

随机点点击边ab的矩形的概率等于第一个坐标命中长度为a的段和第二个坐标的概率点击长度为b的细分。 (我们正在讨论矩形到轴的投影)。

第一个概率为a / A,第二个概率为b / B。 由于这些变量是独立的,概率乘以,因此得到的概率为ab / AB,因此我们有一个统一的二维分布,因为概率与矩形的面积成正比。这个公式相对于ab是对称的,所以引用中的观察对于窄矩形和宽矩形是错误的。

答案 1 :(得分:2)

Ascii art:

采用3x3矩形:

***
***
***

将其中一方扩散3倍:

*..*..*..*
*..*..*..*
*..*..*..*

你可以在这里看到,这些点在垂直方向上比在水平方向上更密集。你真正想要的是按地区统一分配

答案 2 :(得分:2)

如何在矩形内生成随机点(按区域均匀分布)?

这应该有效:

  // given A, B, dimensions of rectangle
  // given g, granularity of shorter side

  if A > B then
     bm := g
     am := floor(g * A / B)
  else then
     am := g
     bm := floor(g * B / A)

  for i := 1 to n do
     av := A * RandomInt(0..am) / am
     bv := B * RandomInt(0..bm) / bm
     print (av, bb)

编辑:一个更简单的选择是简单地按随同的因子缩放随机浮点值,随机选择点,并丢弃落在矩形之外的点。但是,在矩形中得到N个点之前,您不知道需要多少次试验......

答案 3 :(得分:1)

处理此问题最直接的方法是通过拒绝抽样:

http://en.wikipedia.org/wiki/Rejection_sampling

// Given dimensions of the rectangle A, B where A <= B
boolean flag = true
while (flag) do:
  double a = NextRandomDouble(0,B)
  double b = NextRandomDouble(0,B)
  if (a <= A)
    return(a, b)
  else
    next

您基本上从适合原始矩形(在此示例中为长度B)的正方形生成统一数字。如果数字落在矩形中,请保留该对。如果没有,扔掉它再试一次!