วิธีสร้างจุดสุ่มภายในวงกลมรัศมีR :
r = R * sqrt(random())
theta = random() * 2 * PI
(สมมติว่าrandom()
ให้ค่าระหว่าง 0 และ 1 เหมือนกัน)
หากคุณต้องการแปลงเป็นพิกัดคาร์ทีเซียนคุณสามารถทำได้
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
ทำไมsqrt(random())
?
ดู Let 's sqrt(random())
คณิตศาสตร์ที่นำไปสู่ สมมติว่าความเรียบง่ายที่เราทำงานกับวงกลมหน่วยคือR = 1
ระยะทางเฉลี่ยระหว่างจุดควรเท่ากันโดยไม่คำนึงว่าไกลแค่ไหนจากจุดศูนย์กลางที่เรามอง นี่หมายถึงตัวอย่างเช่นเมื่อมองไปที่เส้นรอบวงของวงกลมที่มีเส้นรอบวง 2 เราควรหาจุดสองเท่าตามจำนวนจุดบนปริมณฑลของวงกลมที่มีเส้นรอบวง 1
ตั้งแต่เส้นรอบวงของวงกลม (2π R ) เติบโตขึ้นเป็นเส้นตรงกับRมันตามที่จำนวนของจุดสุ่มจะเติบโตเป็นเส้นตรงกับR กล่าวอีกนัยหนึ่งฟังก์ชันความหนาแน่นของความน่าจะเป็นที่ต้องการ(PDF) จะเพิ่มขึ้นเป็นเส้นตรง เนื่องจาก PDF ควรมีพื้นที่เท่ากับ 1 และรัศมีสูงสุดคือ 1 เราจึงมี
ดังนั้นเราจึงรู้ว่าความหนาแน่นที่ต้องการของค่าสุ่มของเราควรเป็นอย่างไร ตอนนี้: เราจะสร้างค่าสุ่มได้อย่างไรเมื่อทั้งหมดที่เรามีคือค่าสุ่มที่สม่ำเสมอระหว่าง 0 ถึง 1
เราใช้เคล็ดลับที่เรียกว่าการสุ่มตัวอย่างการแปลงผกผัน
- จาก PDF ให้สร้างฟังก์ชันการแจกแจงสะสม (CDF)
- สะท้อนสิ่งนี้ตามy = x
- ใช้ฟังก์ชันผลลัพธ์กับค่าสม่ำเสมอระหว่าง 0 ถึง 1
ฟังดูซับซ้อนไหม? ให้ฉันแทรก blockquote ด้วยเพลงเล็ก ๆ ที่สื่อถึงสัญชาตญาณ:
สมมติว่าเราต้องการสร้างจุดสุ่มด้วยการแจกแจงต่อไปนี้:
นั่นคือ
- 1/5 ของคะแนนเท่ากันระหว่าง 1 และ 2 และ
- 4/5 ของคะแนนอย่างสม่ำเสมอระหว่าง 2 และ 3
CDF คือเวอร์ชั่นสะสมของ PDF สังหรณ์ใจ: ในขณะที่รูปแบบไฟล์ PDF ( x ) อธิบายจำนวนของค่าสุ่มที่ x , CDF ( x ) อธิบายจำนวนของค่าสุ่มน้อยกว่า x
ในกรณีนี้ CDF จะมีลักษณะดังนี้:
เพื่อดูว่ามันมีประโยชน์อย่างไรลองจินตนาการว่าเรายิงกระสุนจากซ้ายไปขวาที่ความสูงเท่ากัน เมื่อกระสุนพุ่งเข้าแถวพวกเขาก็ตกลงไปที่พื้น:
ดูว่าความหนาแน่นของกระสุนบนพื้นดินสอดคล้องกับการกระจายตัวที่เราต้องการได้อย่างไร! เราเกือบจะถึงแล้ว!
ปัญหาคือว่าสำหรับฟังก์ชั่นนี้Yแกนเป็นเอาท์พุทและxแกนคือการป้อนข้อมูล เราทำได้แค่ "กระสุนยิงจากพื้นดินขึ้นไป"! เราต้องการฟังก์ชันอินเวอร์ส!
นี่คือเหตุผลที่เราสะท้อนสิ่งทั้งหมด xกลายเป็นyและyกลายเป็นx :
เราเรียกสิ่งนี้CDF -1 เพื่อรับค่าตามการแจกแจงที่ต้องการเราใช้ CDF -1 (สุ่ม ())
... เพื่อกลับไปสร้างค่ารัศมีสุ่มที่รูปแบบไฟล์ PDF ของเราเท่ากับ 2 x
ขั้นตอนที่ 1: สร้าง CDF:
เนื่องจากเรากำลังทำงานกับ reals CDF จึงแสดงเป็นส่วนหนึ่งของ PDF
CDF ( x ) = ∫ 2 x = x 2
ขั้นตอนที่ 2: จำลอง CDF ตามy = x :
ในทางคณิตศาสตร์สิ่งนี้ทำให้เดือดร้อนเพื่อแลกเปลี่ยนxและyและแก้หาy :
CDF : y = x 2
สลับ: x = y 2
แก้ปัญหา: y = √ x
CDF -1 : y = √ x
ขั้นตอนที่ 3: ใช้ฟังก์ชันผลลัพธ์กับค่าสม่ำเสมอระหว่าง 0 ถึง 1
CDF -1 (สุ่ม ()) = √random ()
อะไรคือสิ่งที่เรากำหนดไว้ว่าจะได้รับ :-)