คุณสามารถทำสิ่งนี้ในพิกัดกลมซึ่งในกรณีนี้จะไม่มีการปฏิเสธ ก่อนอื่นคุณสร้างรัศมีและมุมทั้งสองโดยการสุ่มจากนั้นคุณใช้สูตรการเปลี่ยนแปลงเพื่อกู้คืน ,และ ( , , )y z x = r บาปθ cos ϕ y = r บาปθ บาปϕ z = r cos θxyzx=rsinθcosϕy=rsinθsinϕz=rcosθ
คุณสร้าง unifomly ระหว่างและ2รัศมีและความเอียงนั้นไม่เหมือนกัน น่าจะเป็นที่จุดอยู่ภายในลูกของรัศมีคือเพื่อฟังก์ชั่นความหนาแน่นของความน่าจะเป็นของคือ 2 คุณสามารถตรวจสอบได้อย่างง่ายดายว่าลูกบาศก์รากของตัวแปรเครื่องแบบมีตรงการกระจายเดียวกันดังนั้นนี้เป็นวิธีที่คุณสามารถสร้างRความน่าจะเป็นที่จุดหนึ่งอยู่ภายในทรงกลมรูปกรวยที่กำหนดโดยการเอียงคือหรือถ้าϕ02πrθrr3r3r2rθ(1−cosθ)/21−(1−cos(−θ))/2θ>π/2 2 ดังนั้นความหนาแน่นเป็น 2 คุณสามารถตรวจสอบว่าลบอาร์คโคซีนของตัวแปรเครื่องแบบมีความหนาแน่นที่เหมาะสมθsin(θ)/2
หรือมากกว่าเพียงแค่เราสามารถจำลองโคไซน์ของสม่ำเสมอ beteenและ1θ−11
ใน R นี้จะมีลักษณะที่แสดงด้านล่าง
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
ในระหว่างการเขียนและแก้ไขคำตอบนี้ฉันรู้ว่าวิธีแก้ปัญหานั้นเล็กน้อยกว่าที่ฉันคิด
ผมคิดว่าวิธีการที่ง่ายที่สุดและคอมพิวเตอร์ที่มีประสิทธิภาพที่สุดคือการปฏิบัติตาม @ วิธี whuber ในการสร้างในหน่วยทรงกลมตามที่ปรากฏในโพสต์นี้และปรับให้พวกเขาด้วยR(x,y,z)r
xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda