在矩形内生成一个随机点(统一)
这假设是一个简单的问题。
然而,在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]的两倍。
鉴于此,请允许我更改我的问题:
如何在矩形内生成随机点(按区域均匀分布)?
答案 0 :(得分:5)
该陈述不正确,两个独立统一措施的直接产品是统一的衡量标准。这可以显示如下:
随机点点击边a
和b
的矩形的概率等于第一个坐标命中长度为a
的段和第二个坐标的概率点击长度为b
的细分。 (我们正在讨论矩形到轴的投影)。
第一个概率为a / A
,第二个概率为b / B
。
由于这些变量是独立的,概率乘以,因此得到的概率为ab / AB
,因此我们有一个统一的二维分布,因为概率与矩形的面积成正比。这个公式相对于a
和b
是对称的,所以引用中的观察对于窄矩形和宽矩形是错误的。
答案 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)的正方形生成统一数字。如果数字落在矩形中,请保留该对。如果没有,扔掉它再试一次!