3

我正在尝试在矩形内生成一定数量的随机均匀点(我知道每个角的坐标对)。

让我们的矩形为 ABCD

我的想法是:用AC对角线将矩形分成两个三角形。求对角线的斜率和截距。然后,从 [0,1] 区间生成两个随机数,令它们为 a,b。评估 x = a AB 和 y = b AD(AB,AD,距离)。如果 A 不是 (0,0),那么我们可以添加到 x 和 y A 的坐标。现在我们有一个点 (x,y)。如果它不在下三角形 (ABC) 中,请跳到下一步。否则,将点添加到我们的绘图中,并添加 (x,y) 与 AC 对角线的对称,这样我们也可以填充上三角形 (ADC)。

我已经实现了这一点,但我高度怀疑这些点是统一生成的(从情节来看)。我应该如何修改我的算法?我想这个问题与我如何选择三角形和对称事物有关。

图片

4

6 回答 6

13

为什么不直接生成 x=random([Ax, Bx]) 和 y=random([By, Cy]) 并将它们放在一起作为 (x,y)?n 维均匀分布只是分量的 n 个均匀分布的乘积。

于 2013-05-17T14:54:43.750 回答
5

这被称为点拾取和其他类似术语。您似乎走在正确的轨道上,因为这些点应该来自均匀分布。你的情节在我看来相当随机。

你在用上下三角形做什么?它们似乎没有必要,而且肯定会使事情变得不那么随机。这是沿着对立变量的方式减少某种形式的方差吗?如果@Paddy3118 是正确的,并且您真的只需要随机点来填充空间,那么您应该研究低差异序列Halton 序列van der Corput 序列推广到多个维度。如果您有 Matlab 的统计工具箱,请查看sobolsetandhaltonset函数或qrandstreamand qrand

于 2013-05-19T03:26:23.813 回答
2

这种方法(来自@Xipan Xiao 和@bonanova。)应该可以在多种语言中重现。MATLAB 代码如下。

a = 0; b = 1;
n = 2000;
X = a + (b-a)*rand(n,1);
Y = a + (b-a)*rand(n,1);

较新版本的 MATLAB 可以使用makedistrandom命令。

pdX = makedist('Uniform',a,b);
pdY = makedist('Uniform',a,b);
X = random(pdX,n,1);
Y = random(pdY,n,1);

这些点将(X,Y)均匀地分布在带有角点的矩形中(a,a), (a,b), (b,a), (b,b)

为了验证,我们可以观察 和 的边际分布,XY看到它们也是均匀的。

scatterhist(X,Y,'Marker','.','Direction','out')  

具有边际分布的散点图

更新:使用haltonset(@horchler 建议)

p = haltonset(2);
XY = net(p,2000);
scatterhist(XY(:,1),XY(:,2),'Marker','.','Direction','out')  

带有直方图的 Halton 集散点图

于 2018-10-20T18:18:00.220 回答
1

如果您追求更均匀的密度,那么您可以考虑使用Van der Corput 序列。该序列可用于Monte-Carlo 模拟,Wolfram Mathworld称它们为准随机序列。

于 2013-05-17T19:44:13.420 回答
0

在区间 [0,1] 中生成两个随机数,将它们转换为 x 和 y 并将它们缩放到您的矩形。

于 2014-02-27T06:35:23.430 回答
0

这只是我的想法,我还没有用代码测试。

1.将矩形划分为具有 N x M 个单元格的网格,取决于可变密度。

2.遍历单元格并在单元格中选择一个随机点,直到它达到您的目标点数量。

于 2021-11-28T11:00:07.440 回答