Bạn cũng có thể làm điều này trong tọa độ hình cầu, trong trường hợp đó không có từ chối. Trước tiên, bạn tạo ra các bán kính và hai góc độ một cách ngẫu nhiên, sau đó bạn sử dụng công thức chuyển đổi sang phục hồi , y và z ( x = r sin θ cos φ , y = r sin θ sin φ , z = r cos θ ).xyzx = r tội lỗiθ cosφy= R sinθ sinφz= r cosθ
Bạn tạo unifomly giữa 0 và 2 π . Bán kính r và độ nghiêng θ là không đồng đều mặc dù. Xác suất một điểm nằm trong quả cầu có bán kính r là r 3 nên hàm mật độ xác suất của r là 3 r 2 . Bạn có thể dễ dàng kiểm tra xem căn bậc ba của một biến thống nhất có cùng phân phối chính xác không, vì vậy đây là cách bạn có thể tạo r . Xác suất mà một điểm dối trá trong một hình nón hình cầu được xác định bởi độ nghiêng θ là ( 1 - cos θφ02 πrθrr3r3r2rθ hoặc 1 - ( 1 - cos ( - θ ) ) / 2 nếu θ > π / 2 . Vì vậy, mật độ θ là s i n ( θ ) / 2 . Bạn có thể kiểm tra trừ đi Arccosine của một biến thống nhất có mật độ phù hợp.(1−cosθ)/21−(1−cos(−θ))/2θ>π/2θsin(θ)/2
Hoặc đơn giản hơn, chúng ta có thể mô phỏng các cosin của beteen thống nhất - 1 và 1 .θ−11
Trong R, nó sẽ trông như dưới đây.
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
Trong quá trình viết và chỉnh sửa câu trả lời này, tôi nhận ra rằng giải pháp này ít tầm thường hơn tôi nghĩ.
(x,y,z)r
xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda