2013-10-11 19 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