我试图在矩形内部生成一定数量的随机均匀点(我知道每个角落的坐标对)。
让我们的矩形成为 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)。
我已经实现了这一点,但我非常怀疑这些点是统一生成的(从图中判断)。我应该如何修改我的算法?我想这个问题与我如何选择三角形和对称的东西有关。
答案 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 sequences。 Halton sequence将van der Corput sequence概括为多个维度。如果您有Matlab的统计工具箱,请查看sobolset
和haltonset
函数或qrandstream
和qrand
。
答案 2 :(得分:1)
如果你的密度更均匀,那么你可能会考虑Van der Corput sequence。蒙特卡罗模拟中的序列finds use和Wolfram 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可以使用makedist
和random
命令。
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)
的矩形中。
为进行验证,我们可以观察到X
和Y
的边际分布,并发现它们也是均匀的。
scatterhist(X,Y,'Marker','.','Direction','out')
更新:使用haltonset
(@ horchler建议)
p = haltonset(2);
XY = net(p,2000);
scatterhist(XY(:,1),XY(:,2),'Marker','.','Direction','out')
答案 4 :(得分:0)
在区间[0,1]平移中生成两个随机数,并将它们缩放为矩形x和y。