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

时间:2013-05-17 14:29:14

标签: linux algorithm matlab geometry octave

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

让我们的矩形成为 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)。

我已经实现了这一点,但我非常怀疑这些点是统一生成的(从图中判断)。我应该如何修改我的算法?我想这个问题与我如何选择三角形和对称的东西有关。

Picture

5 个答案:

答案 0 :(得分:11)

为什么不生成x = random([A.x,B.x])和y = random([B.y,C.y])并将它们组合成(x,y)? n维均匀分布只是组分的n个均匀分布的乘积。

答案 1 :(得分:5)

这被称为point picking和其他类似术语。你似乎走在正确的轨道上,因为这些点应该来自均匀分布。你的情节看起来很随机。

你在做什么用上三角和下三角?它们似乎是不必要的,肯定会减少随机性。这是某种形式的方差减少antithetic variates吗?如果@ Paddy3118是正确的,你真的需要随机点来填充空间,那么你应该研究low-discrepancy sequencesHalton sequencevan der Corput sequence概括为多个维度。如果您有Matlab的统计工具箱,请查看sobolsethaltonset函数或qrandstreamqrand

答案 2 :(得分:1)

如果你的密度更均匀,那么你可能会考虑Van der Corput sequence。蒙特卡罗模拟中的序列finds useWolfram Mathworld称它们为准随机序列。

答案 3 :(得分:1)

这种方法(来自@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')  

Scatterplot with marginal distributions

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

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

Halton Set Scatterplot with histograms

答案 4 :(得分:0)

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