1. आयताकार समतल धारणा की मौलिक त्रुटि
2D मानचित्र पर पृथ्वी एक समतल आयत जैसी दिखती है जिसमें अक्षांश -90° से +90° और देशांतर -180° से +180° तक होता है।
कई कोडिंग ट्यूटोरियल इस तरह से रैंडम निर्देशांक बनाने की सलाह देते हैं:
// ❌ Naive algorithm (Suffers from polar bias bug) const latitude = (Math.random() * 180) - 90; const longitude = (Math.random() * 360) - 180;
यद्यपि यह कोड मान्य संख्याएं देता है, यह सभी अक्षांश पट्टियों को समान क्षेत्रफल वाला मानता है। वास्तविक 3D गोले पर अक्षांश की परिधि cos(अक्षांश) के अनुसार घटती है:
भूमध्य रेखा (0°) पर परिधि 40,075 किमी है, जबकि 80° उत्तर पर यह केवल 6,950 किमी रह जाती है। समतल सूत्र ध्रुवों पर भूमध्य रेखा की तुलना में 5.7 गुना अधिक सघन बिंदु बनाता है!
2. मार्सग्लिया समान-क्षेत्र गोलाकार रूपांतरण
गोले की सतह पर समान रूप से वितरित बिंदु उत्पन्न करने के लिए प्रायिकता घनत्व क्षेत्रफल अवकलज के समानुपाती होना चाहिए:
चूंकि क्षेत्रफल अवकलज d(sin θ) के समानुपाती है, हम [-1, 1] अंतराल में sin(θ) का समान चयन करते हैं:
// ✅ Correct Archimedes-Lambert-Marsaglia equal-area algorithm:
function getRandomSpherePoint() {
const u = Math.random(); // Uniform in [0, 1)
const v = Math.random(); // Uniform in [0, 1)
// Invert the cumulative distribution function:
const sinLat = 2 * u - 1; // Uniform in [-1, 1]
const latRad = Math.asin(sinLat); // In radians
const lat = latRad * (180 / Math.PI); // In degrees [-90, +90]
const lng = -180 + v * 360; // In degrees [-180, +180]
return { lat, lng };
}यह सुरुचिपूर्ण गणितीय परिवर्तन सुनिश्चित करता है कि पृथ्वी पर प्रत्येक वर्ग किलोमीटर चुने जाने की समान संभावना रखता है।
3. भूमि अस्वीकृति सैंपलिंग और PRNG पुनरावृत्ति
पृथ्वी का लगभग 71% भाग महासागर है। जब उपयोगकर्ता केवल भूमि चुनता है, तो हम अस्वीकृति सैंपलिंग का उपयोग करते हैं:
- एक समान-क्षेत्र गोलाकार बिंदु बनाएं।
- महाद्वीपीय बहुभुज डेटा के विरुद्ध बिंदु का परीक्षण करें।
- यदि बिंदु महासागर में गिरता है, तो उसे अस्वीकार कर अधिकतम 250 प्रयासों तक पुनः उत्पन्न करें।
पुनरावृत्ति के लिए हमारा इंजन 53-बिट cyrb53 हैश और 32-बिट mulberry32 PRNG को जोड़ता है, जो 100% विश्वसनीय परिणाम सुनिश्चित करता है।