这些都可以使用转换后的统一变量进行采样而不会拒绝。
矩形:
set.seed(94)
u <- runif(1.5e4, max = 3)
v <- runif(1.5e4, max = 2)
x <- u + v - 10
y <- v - u + 8
# sanity check
range(x + y)
#[1] -1.999774 1.999826
range(x - y + 15)
#[1] -2.999646 2.999692
plot(x, y)
椭圆(见Algorithm: Calculate pseudo-random point inside an ellipse):
phi <- runif(1e4, max = 2*pi)
rho <- sqrt(runif(1e4))
x <- sqrt(5)*rho*cos(phi) + 6
y <- sqrt(10/3)*rho*sin(phi) + 4
# sanity check
range(2*(x - 6)^2 + 3*(y - 4)^2)
#[1] 0.001536582 9.999425234
plot(x, y)
派生更新:
矩形:
矩形由以下线条界定:
y = -2 - x
y = 2 - x
y = x + 12
y = x + 18
矩形的最左边点是通过第一条线和最后一条线相交的点 (-10, 8) 找到的。
矩形的尺寸为 3*sqrt(2) 和 2*sqrt(2),因此请从具有以下尺寸的矩形中取样:
u = 3*sqrt(2)*U1
v = 2*sqrt(2)*U2
其中 U1 和 U2 是标准的均匀随机变量(即runif)。
由于边界线的斜率为 -1 和 1,我们可以将矩形视为围绕原点轴旋转 -90°。将 u 和 v 旋转 -90° 以将包含 (u, v) 的矩形定向到与所需矩形相同的方向:
x = u*cos(-90°) - v*sin(-90°) = sqrt(2)*(u + v)/2 = 3*U1 - 2*U2
y = v*cos(-90°) + u*sin(-90°) = sqrt(2)*(v - u)/2 = 3*U1 + 2*U2
(x, y) 的最左边的点仍然在原点,因此将点平移 (-10, 8) 以匹配所需的矩形:
x = 3*U1 - 2*U2 - 10
y = 3*U1 + 2*U2 + 8
椭圆:
x - 6 和 y - 4 表示您的椭圆以 (6, 4) 为中心。
忽略 6 和 4,使椭圆居中于原点,然后以标准形式写出椭圆的方程:
x^2/a^2 + y^2/b^2 = 1
a = sqrt(5)
b = sqrt(10/3)
a 和 b 是椭圆的尺寸。