R yarıçapı dairesinde rastgele bir nokta nasıl oluşturulur :
r = R * sqrt(random())
theta = random() * 2 * PI
( random()
0 ile 1 arasında eşit olarak bir değer verdiğini varsayarsak )
Bunu Kartezyen koordinatlarına dönüştürmek istiyorsanız,
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
Neden sqrt(random())
?
Gelen matematiğe bakalım sqrt(random())
. Basitlik için birim çemberle çalıştığımızı varsayalım, yani R = 1.
Noktalar arasındaki ortalama mesafe, merkezden ne kadar uzakta göründüğümüzden bağımsız olarak aynı olmalıdır. Bu, örneğin, çevresi 2 olan bir dairenin çevresine baktığımızda, çevresi 1 olan bir dairenin çevresindeki nokta sayısından iki kat daha fazla nokta bulmamız gerektiği anlamına gelir.
Bir daire (2π çevresi yana r ) ile lineer büyür r , rasgele nokta sayısı ile doğrusal büyümesi gerektiğini aşağıdaki r . Başka bir deyişle, istenen olasılık yoğunluk fonksiyonu (PDF) doğrusal olarak büyür. Bir PDF'nin alanı 1'e eşit olduğundan ve maksimum yarıçap 1 olduğunda,
Bu yüzden rastgele değerlerimizin istenen yoğunluğunun nasıl olması gerektiğini biliyoruz. Şimdi: Elimizdeki tek şey 0 ile 1 arasında tekdüze rastgele bir değer olduğunda nasıl böyle rastgele bir değer üretebiliriz?
Ters dönüşüm örnekleme adı verilen bir numara kullanıyoruz
- PDF'den kümülatif dağıtım işlevini (CDF) oluşturun
- Bunu y = x boyunca yansıt
- Ortaya çıkan işlevi 0 ile 1 arasında eşit bir değere uygulayın.
Kulağa karmaşık mı geliyor? Sezgiyi ileten küçük bir yan iz içeren bir blok ekleyeyim:
Aşağıdaki dağıtımla rastgele bir nokta oluşturmak istediğimizi varsayalım:
Yani
- 1/2 arasındaki noktaların 1/5'i eşit ve
- 4/5 puan 2 ve 3 arasında eşit olarak.
CDF, adından da anlaşılacağı gibi, PDF'nin kümülatif sürümüdür. Sezgisel olarak: PDF (iken X ) rastgele değerleri sayısını tarif x'in CDF ( X ) rastgele değerleri sayısını tarif az x'den .
Bu durumda CDF şöyle görünecektir:
Bunun nasıl faydalı olduğunu görmek için mermilerin soldan sağa düzgün dağılmış yüksekliklerde ateş ettiğimizi hayal edin. Mermiler çizgiyi vurduğunda yere düşer:
Yerdeki mermilerin yoğunluğunun istenen dağılımımıza nasıl karşılık geldiğini görün! Neredeyse geldik!
Sorun, bu işlev için y ekseninin çıkış ve x ekseninin giriş olmasıdır . Biz sadece "yerden mermi ateţ edebiliriz!" Ters fonksiyona ihtiyacımız var!
Bu yüzden her şeyi yansıtıyoruz; X olur y ve y olur x :
Biz buna CDF -1 diyoruz . İstenilen dağılıma göre değerler elde etmek için CDF -1 (random ()) kullanıyoruz.
… Böylece, PDF'imizin 2 x'e eşit olduğu yerde rastgele yarıçap değerleri üretmeye geri dönelim .
Adım 1: CDF'yi oluşturun:
Gerçeklerle çalıştığımızdan, CDF PDF'nin ayrılmazı olarak ifade edilir.
CDF ( x ) = ∫ 2 x = x 2
Adım 2: CDF'yi y = x boyunca yansıtın :
Matematiksel olarak bu takas için aşağı kaynar x ve y ve çözme için y :
CDF : y = x 2
Değiştirme: x = y 2
Çözme: y = √ x
CDF -1 : y = √ x
Adım 3: Ortaya çıkan işlevi 0 ile 1 arasında eşit bir değere uygulayın
CDF -1 (rastgele ()) = √random ()
Hangi türetmek için yola çıktı :-)