Anda juga dapat melakukan ini dalam koordinat bola, dalam hal ini tidak ada penolakan. Pertama Anda menghasilkan jari-jari dan dua sudut secara acak, kemudian Anda menggunakan rumus transisi untuk memulihkan , dan ( , , ).y z x = r sin θ cos ϕ y = r dosa θ sin ϕ z = r cos θxyzx=rsinθcosϕy=rsinθsinϕz=rcosθ
Anda menghasilkan tunggal antara dan . Jari-jari dan kemiringan tidak seragam. Probabilitas bahwa suatu titik berada di dalam bola jari-jari adalah sehingga fungsi kerapatan probabilitas adalah . Anda dapat dengan mudah memeriksa bahwa akar kubik dari variabel seragam memiliki distribusi yang persis sama, jadi ini adalah bagaimana Anda dapat menghasilkan . Probabilitas bahwa suatu titik terletak dalam kerucut bola yang didefinisikan oleh kecenderungan adalah atau jika0 2 π r θ r r 3 r 3 r 2 rϕ02πrθrr3r3r2rθ(1−cosθ)/21−(1−cos(−θ))/2θ>π/2 . Jadi kepadatan adalah . Anda dapat memeriksa bahwa minus arccosine dari variabel seragam memiliki kepadatan yang tepat.θsin(θ)/2
Atau lebih sederhana, kita dapat mensimulasikan kosinus dari secara seragam antara dan .θ−11
Dalam R ini akan terlihat seperti yang ditunjukkan di bawah ini.
n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta
Dalam proses menulis dan mengedit jawaban ini, saya menyadari bahwa solusinya kurang sepele daripada yang saya kira.
Saya berpikir bahwa metode termudah dan paling efisien secara komputasi adalah mengikuti metode @ whuber untuk menghasilkan pada unit sphere seperti yang ditunjukkan pada posting ini dan skala mereka dengan .r(x,y,z)r
xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda