2013-10-11 26 views
7

Bir * 100 düzlemde eşit dağıtılmış daireler/noktalar/düğümler oluşturmak istiyorum. Bunun için java'da Random() yöntemini kullanıyorum. Özellikle aşağıdaki şekilde bunu yaptığını am:Tekdüze Bir düzlemde dağıtılmış noktalar java'da kümeleniyor, neden?

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

Ama sorun tekrar tekrar kod koş, düğümler eşit düzlemde aralıklı değil, yani örneğin, konsantrasyon kümeleri vardır ve işgal edilmemiş alanın bazı parçaları.

Herhangi bir fikir, öneri çok takdir edilecektir. Görüntü belleri kümeler ve beyaz boşluklarla normal bir çıktı gösterir. Çevrelerin sayısı, yalnızca çevrelerin kimlikleridir. enter image description here

+6

Rastgele sayıların kümelenmediği yaygın bir yanlış anlamadır. Bunların yeterli olmaması durumunda kesinlikle kümelenmeler oluştururlar. Tekdüzelik istiyorsanız, o zaman düzgün bir jeneratörü kodlayın (düzlemi eşit olarak bölün ve buna göre puan verin). – Adam

+0

Cevabınız için teşekkür ederiz, daha fazla açıklayabilir misiniz lütfen. Düzlemi eşit olarak bölmek ve düğümleri buna göre yerleştirmek için söylediğim kısmı alamadım. – OAH

+0

@Anderson [Doğum günü problemi] 'ne bir göz atmalısınız (http://en.wikipedia.org/wiki/Birthday_problem). – SpaceTrucker

cevap

5

Eğer rastgele istiyorsanız Daha fazla "eşit" görünmek için dağılım, yani alanı daha eşit bir şekilde kaplamak istiyorsanız, @Adam'ın işaret ettiği gibi "boşluklar" içereceğinden tamamen düzgün bir dağılımı kullanamazsınız. Örneğin, Low-discrepancy sequence: Halton sequence veya Sobol sequence adlı bir işlevi kullanabilirsiniz. Vikipedi örnek resimlerinde gördüğünüz gibi, tekdüze dağılımlarla sahip olduğunuz kümeleri ve boşlukları önlerler.

+0

Çok teşekkür ederim, hızla wikipedia fotoğraflarını gördüm ve tam olarak ne rastgele ama boşlukları aradığımı.Sadece hızlı bir soru, bu "Düşük tutarsızlık dizileri" üniform dağılımın bazı uygulamaları olarak kabul edilir? çünkü onlar bana eşit olarak dağıtılmış görünüyorlar. Tekrar teşekkürler. – OAH

+1

Onlar üniforma. Halton dizisi için görmek kolay, sadece x eşit aralıklarla ve eşit olarak, sadece farklı bir "eşit". – Adam

+0

@Flavio jitter'in eklenmesinin en iyi yolunun ne olduğunu biliyor musunuz? Açıkçası, koordinatları rastgele bozabilirsin, ama bu nasıl bir bütünlüğü etkiler? – Adam

1

100 puan ile 100x100 birim düzlemi kastettiğinizi varsayalım.

Düzleminizin üzerinde bir 10x10 ızgarası, her bir grid kutusu için 1 nokta ile eşit olarak dağıtılmış 100 nokta anlamına gelir. Oldukça var tam eşitliğinin sağlanması için merkezde

Yeri puan:

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

Veya titreşim biraz için, her ızgara kutusu içindeki konumunu rastgele:

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

Bunun için çok teşekkür ederim. Ancak bir ızgara olmayan bir şey arıyorum. Ekli şekildeki dairelere bakarak, bazı bölümler çok yüklüdür, bazıları ise bazıları değildir. Bazıları için daha düzgün dağılımı olan aşırı ayardan hareket etmenin bir yolunu arıyorum (ancak bir ızgara değil).). Rastgele sayı üreteci ile, yani Y-koordinatları için bir 2. R.N.G'yi veya bunun gibi bir şeyi kullanabileceğim herhangi bir şey var mı? Thx – OAH

+0

İkinci yaklaşım, düzgünlüğünüzü kontrol etmek için daha büyük/küçük bir ızgara kullanılarak ayarlanabilir. Kutu başına 4 rastgele noktaya sahip 5x5 ızgara kullanırsanız, daha fazla rastgelelik, daha az tekdüzelik, ancak çözümünüzdeki kadar değil. Aslında çözümün 1x1 ızgara ile ne olduğunu. – Adam

İlgili konular