在矩形内(均匀地)生成随机点?
Posted
技术标签:
【中文标题】在矩形内(均匀地)生成随机点?【英文标题】:Generate random points inside a rectangle (uniformly)? 【发布时间】:2013-05-12 18:29:34 【问题描述】:我正在尝试在矩形内生成一定数量的随机均匀点(我知道每个角的坐标对)。
让我们的矩形是 ABCD
我的想法是: 用 AC 对角线将矩形分成两个三角形。求对角线的斜率和截距。 然后,从 [0,1] 区间生成两个随机数,令它们为 a,b。 计算 x = aAB 和 y = bAD(AB、AD、距离)。如果 A 不是 (0,0),那么我们可以添加到 x 和 y A 的坐标。 现在我们有一个点 (x,y)。如果它不在下三角形 (ABC) 中,请跳到下一步。 否则,将点添加到我们的绘图中,并添加 (x,y) 与 AC 对角线的对称,这样我们也可以填充上三角形 (ADC)。
我已经实现了这一点,但我高度怀疑这些点是统一生成的(从情节来看)。我应该如何修改我的算法?我想这个问题与我如何选择三角形和对称的东西有关。
【问题讨论】:
您能否详细说明“随机制服”的含义。这些不是互补的想法,我可以设想几种定义“均匀随机”的方法。此外,将您对算法的散文解释重新格式化为伪代码将有助于澄清您在做什么。 小心随机分布:The Illusion of Randomness!您可以绘制坐标直方图来验证数据的随机性。 “随机均匀”是指我应该生成必须均匀分布在矩形区域中的随机数。 让 MATLAB 确定伪随机分布的“均匀性”。如果有的话,分布的均匀性会消除“随机”部分。不要试图操纵你的价值观。取一堆随机点并绘制它们。分组、空白等是伪随机表的废止,如果有的话,它们是质量伪随机分布的证据。即使在均匀分布中,如果我们从它们中随机选择,我们也会期望看到分组、空虚,甚至可能偶尔会连续出现相同的点。 你怎么知道我上过多少统计学课程,你在 NSA 吗?我不是在质疑我对均匀分布的理解,而是在质疑 OP,因为他的表述方式与熟悉统计学的人不同,并且听起来像是他误解了他的家庭作业。又名:均匀分布与均匀生成矩形中的随机点?听起来他的期望是网格中的一组点。如果你真的阅读了所有的 cmets,这就很清楚了。如果您在 9 个月后要添加一些富有成效的东西(在此处放置数学笑话),那就去做吧。 【参考方案1】:为什么不直接生成 x=random([A.x, B.x]) 和 y=random([B.y, C.y]) 并将它们放在一起作为 (x,y)?一个 n 维均匀分布只是分量的 n 个均匀分布的乘积。
【讨论】:
【参考方案2】:这被称为point picking 和其他类似术语。您似乎走在正确的轨道上,因为这些点应该来自均匀分布。你的情节在我看来相当随机。
你对上下三角形做了什么?它们似乎没有必要,而且肯定会使事情变得不那么随机。这是按照antithetic variates 的方式减少某种形式的方差吗?如果@Paddy3118 是正确的并且您真的只需要随机点来填充空间,那么您应该查看low-discrepancy sequences。 Halton sequence 将van der Corput sequence 推广到多个维度。如果您有 Matlab 的统计工具箱,请查看 sobolset
和 haltonset
函数或 qrandstream
和 qrand
。
【讨论】:
【参考方案3】:这种方法(来自@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】:如果您追求更均匀的密度,那么您可以考虑使用Van der Corput sequence。蒙特卡罗模拟中的序列finds use 和Wolfram Mathworld 称它们为准随机序列。
【讨论】:
【参考方案5】:在区间 [0,1] 中生成两个随机数,并将它们转换为 x 和 y 并将它们缩放到您的矩形。
【讨论】:
举一些例子来回答 SO 的要求,否则将其作为评论。【参考方案6】:这只是我的想法,我还没有用代码测试。
1.将矩形划分为具有 N x M 个单元格的网格,取决于可变密度。
2.遍历单元格并在单元格中选择一个随机点,直到它达到您的目标点数量。
【讨论】:
以上是关于在矩形内(均匀地)生成随机点?的主要内容,如果未能解决你的问题,请参考以下文章