2013-10-11 18 views
7

我想在* 100平面上生成均匀分布的圆/点/节点。为此,我在java中使用Random()方法。具体而言,我在这样做以下列方式:平面上的均匀分布点正在Java中聚集,为什么?

Random r1=new Random(); 
    for(int i=0;i<100;i++){ 
    x=100*r1.nextDouble(); 
    y=100*r1.nextDouble(); 
} 

但问题是,作为予反复运行代码再次,节点不是均匀地在平面上间隔开,即,有浓度的簇和一些未被占用的空间。

任何想法,建议将不胜感激。 下图显示了群集和空白区域的典型输出。圆圈的数量只是圆圈的ID。 enter image description here

+6

这是一个常见的误解,即随机数是非聚集的。如果它们不够多,它们肯定会形成群集。如果你想要统一,那么编写一个统一的发电机(均匀划分飞机并相应地放置点)。 – Adam

+0

谢谢你的回应,请你澄清一下。我没有得到你所说的将飞机均匀划分并相应放置节点的部分。 – OAH

+0

@Anderson你应该看看[生日问题](http://en.wikipedia.org/wiki/Birthday_problem)。 – SpaceTrucker

回答

5

如果你希望你的随机分布看起来更“平均”,即你想更均匀地覆盖空间,你不能使用完全一致的分布,因为它将包含“空白”,正如@Adam指出的那样。

您可以改用Low-discrepancy sequence之类的东西:Halton sequenceSobol sequence。正如您在维基百科示例图片中看到的那样,它们避免了使用均匀分布的聚类和间隙。

+0

非常感谢您,我很快在维基百科上看到了这些图片,这正是我所期望的随机但没有差距的图片。只是一个简单的问题,这些“低差异序列”是否被认为是均匀分布的一些实现?因为它们看起来均匀分布给我。再次感谢你。 – OAH

+1

他们是统一的。对于Halton序列很容易看出,它只是将范围均匀地分配在x上,并均匀地分配在y上,只是不同的“均匀”。 – Adam

+0

@Flavio你知道什么是增加抖动的最佳方法吗?显然你可以随机扰动坐标,但是这会如何影响均匀性? – Adam

1

我假设你的意思是一个100x100的单位平面,有100个点。

一个10x10的网格覆盖在您的飞机上,每个网格框1个点意味着100个均匀分布的点。在该中心的精确一致性

将分就不错:

for(int i=0;i<100;i++){ 
    x = 5 + 10*(i/10); 
    y = 5 + i % 10; 
} 

或者抖动的一点点,每个网格盒子内随机位置:

Random r1=new Random(); 
for(int i=0;i<100;i++){ 
    x = 10*r1.nextDouble() + 10*(i/10); 
    y = 10*r1.nextDouble() + i % 10; 
} 
+0

非常感谢你。不过,我正在寻找不是网格的东西。我的意思是通过查看附图中的圆圈,一些部分是如此重的负载,而另一些不是我正在寻找一种方式从我现在的极端环境移动到一些更均匀的分布(但不是一个网格)。有没有什么我可以用随机数发生器,即使用第二R.N.G的Y坐标或类似的东西? Thx – OAH

+0

第二种方法可以通过使用更大/更小的网格来调整您的均匀性。如果你使用一个5×5的网格,每个盒子有4个随机点,那么你的随机性就会更大,更少的均匀性,但不如你的解决方案那么多。事实上,您的解决方案就是1x1网格发生的情况。 – Adam