Cara menghasilkan titik acak dalam lingkaran jari-jari R :
r = R * sqrt(random())
theta = random() * 2 * PI
(Dengan asumsi random()
memberikan nilai antara 0 dan 1 secara seragam)
Jika Anda ingin mengonversikan ini ke koordinat Cartesian, Anda dapat melakukannya
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
Mengapa sqrt(random())
?
Mari kita lihat matematika yang mengarah ke sqrt(random())
. Asumsikan untuk kesederhanaan bahwa kita sedang bekerja dengan lingkaran unit, yaitu R = 1.
Jarak rata-rata antara titik harus sama terlepas dari seberapa jauh dari pusat yang kita lihat. Ini berarti misalnya, bahwa dengan melihat keliling lingkaran dengan keliling 2 kita harus menemukan dua kali lebih banyak poin daripada jumlah poin pada keliling lingkaran dengan keliling 1.
Karena keliling lingkaran (2π r ) tumbuh linier dengan r , maka jumlah titik acak harus tumbuh linier dengan r . Dengan kata lain, fungsi probabilitas kerapatan yang diinginkan (PDF) tumbuh secara linear. Karena PDF harus memiliki luas sama dengan 1 dan radius maksimum adalah 1, kami punya
Jadi kita tahu bagaimana kepadatan yang diinginkan dari nilai acak kita akan terlihat. Sekarang: Bagaimana kita menghasilkan nilai acak seperti itu ketika semua yang kita miliki adalah nilai acak seragam antara 0 dan 1?
Kami menggunakan trik yang disebut sampling transformasi terbalik
- Dari PDF, buat fungsi distribusi kumulatif (CDF)
- Cerminkan ini di sepanjang y = x
- Terapkan fungsi yang dihasilkan ke nilai seragam antara 0 dan 1.
Kedengarannya rumit? Biarkan saya menyisipkan blockquote dengan trek samping kecil yang menyampaikan intuisi:
Misalkan kita ingin menghasilkan titik acak dengan distribusi berikut:
Itu adalah
- 1/5 poin secara seragam antara 1 dan 2, dan
- 4/5 poin secara seragam antara 2 dan 3.
CDF adalah, seperti namanya, versi kumulatif dari PDF. Secara intuitif: Sementara PDF ( x ) menjelaskan jumlah nilai acak pada x , CDF ( x ) menjelaskan jumlah nilai acak kurang dari x .
Dalam hal ini CDF akan terlihat seperti:
Untuk melihat bagaimana ini berguna, bayangkan kita menembakkan peluru dari kiri ke kanan pada ketinggian yang merata. Ketika peluru mengenai garis, mereka jatuh ke tanah:
Lihat bagaimana kepadatan peluru di tanah sesuai dengan distribusi yang kami inginkan! Kita hampir sampai!
Masalahnya adalah bahwa untuk fungsi ini, sumbu y adalah output dan sumbu x adalah input . Kita hanya bisa "menembakkan peluru dari tanah lurus ke atas"! Kami membutuhkan fungsi terbalik!
Inilah sebabnya kami mencerminkan semuanya; x menjadi y dan y menjadi x :
Kami menyebutnya CDF -1 . Untuk mendapatkan nilai sesuai dengan distribusi yang diinginkan, kami menggunakan CDF -1 (acak ()).
... jadi, kembali untuk menghasilkan nilai radius acak di mana PDF kami sama dengan 2 x .
Langkah 1: Buat CDF:
Karena kami bekerja dengan real, CDF diekspresikan sebagai bagian integral dari PDF.
CDF ( x ) = ∫ 2 x = x 2
Langkah 2: Mirror CDF sepanjang y = x :
Secara matematis ini bermuara pada bertukar x dan y dan memecahkan untuk y :
CDF : y = x 2
Tukar: x = y 2
Selesaikan: y = √ x
CDF -1 : y = √ x
Langkah 3: Terapkan fungsi yang dihasilkan ke nilai yang seragam antara 0 dan 1
CDF -1 (acak ()) = andomrandom ()
Apa yang ingin kami peroleh :-)