त्रिज्या R के एक वृत्त के भीतर एक यादृच्छिक बिंदु कैसे उत्पन्न करें :
r = R * sqrt(random())
theta = random() * 2 * PI
(मान लें random()
कि 0 और 1 के बीच समान रूप से एक मान देता है)
यदि आप इसे कार्टेशियन निर्देशांक में बदलना चाहते हैं, तो आप कर सकते हैं
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
क्यों sqrt(random())
?
आइए उस गणित को देखें जो आगे बढ़ता है sqrt(random())
। सादगी के लिए मान लें कि हम यूनिट सर्कल यानी R = 1 के साथ काम कर रहे हैं ।
अंकों के बीच की औसत दूरी समान होनी चाहिए, भले ही हम केंद्र से कितनी दूर दिखते हों। उदाहरण के लिए, इसका मतलब है कि परिधि 2 के साथ एक वृत्त की परिधि को देखते हुए हमें परिधि 1 के साथ एक वृत्त की परिधि पर बिंदुओं की संख्या के दोगुने अंक प्राप्त करने चाहिए।
के बाद से एक चक्र (2π की परिधि आर ) के साथ रैखिक बढ़ता आर , यह इस प्रकार है कि यादृच्छिक अंकों की संख्या के साथ रैखिक बढ़ने चाहिए आर । दूसरे शब्दों में, वांछित संभावना घनत्व फ़ंक्शन (पीडीएफ) रैखिक रूप से बढ़ता है। चूंकि पीडीएफ में 1 के बराबर क्षेत्र और अधिकतम त्रिज्या 1 होना चाहिए, हमारे पास है
इसलिए हम जानते हैं कि हमारे यादृच्छिक मूल्यों का वांछित घनत्व कैसा दिखना चाहिए। अब: हम कैसे इस तरह के एक यादृच्छिक मूल्य उत्पन्न करते हैं जब हमारे पास 0 और 1 के बीच एक समान यादृच्छिक मूल्य होता है?
हम एक ट्रिक का उपयोग करते हैं जिसे उलटा ट्रांसफॉर्मिंग सैंपलिंग कहा जाता है
- PDF से, संचयी वितरण फ़ंक्शन (CDF) बनाएं
- इसे y = x के साथ मिरर करें
- परिणामी फ़ंक्शन को 0 और 1 के बीच एक समान मूल्य पर लागू करें।
जटिल लगता है? मुझे एक छोटी सी साइड ट्रैक के साथ एक ब्लॉकक्वाइन डालें जो अंतर्ज्ञान को व्यक्त करता है:
मान लें कि हम निम्नलिखित वितरण के साथ एक यादृच्छिक बिंदु उत्पन्न करना चाहते हैं:
अर्थात्
- 1 और 2 के बीच समान रूप से 1/5 अंक, और
- 2 और 3 के बीच समान रूप से 4/5 अंक।
सीडीएफ, जैसा कि नाम से पता चलता है, पीडीएफ का संचयी संस्करण है। Intuitively: पीडीएफ (जबकि एक्स ) यादृच्छिक मानों की संख्या का वर्णन करता है एक्स पर , CDF ( एक्स ) यादृच्छिक मानों की संख्या का वर्णन करता है एक्स की तुलना में कम ।
इस मामले में CDF ऐसा दिखेगा:
यह देखने के लिए कि यह कैसे उपयोगी है, कल्पना कीजिए कि हम समान रूप से वितरित ऊंचाइयों पर बाएं से दाएं गोलियां मारते हैं। जैसे ही गोलियां रेखा से टकराईं, वे नीचे जमीन पर गिर गईं:
देखें कि जमीन पर गोलियों का घनत्व हमारे वांछित वितरण के अनुरूप कैसे है! हम बस पहुँच गए!
समस्या यह है कि इस फ़ंक्शन के लिए, y अक्ष आउटपुट है और x अक्ष इनपुट है । हम केवल "जमीन से गोलियां सीधे गोली मार सकते हैं"! हमें उलटा फ़ंक्शन चाहिए!
यही कारण है कि हम पूरी बात को प्रतिबिंबित करते हैं; x बनता है y और y बनता है x :
हम इसे CDF -1 कहते हैं । वांछित वितरण के अनुसार मान प्राप्त करने के लिए, हम सीडीएफ -1 (यादृच्छिक ()) का उपयोग करते हैं।
… इसलिए, यादृच्छिक त्रिज्या मान उत्पन्न करने के लिए जहां हमारा पीडीएफ 2 x के बराबर है ।
चरण 1: सीडीएफ बनाएं:
चूंकि हम वास्तविक के साथ काम कर रहे हैं, सीडीएफ को पीडीएफ के अभिन्न अंग के रूप में व्यक्त किया गया है।
CDF ( x ) = = 2 x = x 2
चरण 2: CDF को y = x के साथ मिरर करें :
गणितीय इस अदला-बदली करने पर निर्भर करता है x और y और के लिए सुलझाने y :
CDF : y = x 2
स्वैप: x = y 2
हल: y = F x
CDF -1 : y = x x
चरण 3: परिणामी फ़ंक्शन को 0 और 1 के बीच एक समान मूल्य पर लागू करें
CDF -1 (यादृच्छिक ()) = (random ()
जिसे हमने :-) प्राप्त करने के लिए निर्धारित किया है