1. الخلل الأساسي في افتراض الخريطة المستطيلة
في إسقاط الخريطة ثنائية الأبعاد (مثل إسقاط مركاتور)، تظهر الأرض كمستطيل مسطح يمتد فيه خط العرض من -90° إلى +90° وخط الطول من -180° إلى +180°.
تنصح العديد من الدروس البرمجية البسيطة بتوليد الإحداثيات بهذه الطريقة:
// ❌ Naive algorithm (Suffers from polar bias bug) const latitude = (Math.random() * 180) - 90; const longitude = (Math.random() * 360) - 180;
ورغم أن هذا الكود ينتج أرقاماً صالحة، إلا أنه يفترض خطأً أن جميع أشرطة خطوط العرض متساوية المساحة. في الكرة الحقيقية، يتقلص محيط دائرة العرض كتابع لجيب تمام خط العرض:
عند خط الاستواء (0°)، يبلغ المحيط حوالي 40,075 كم. بينما عند 80° شمالاً يتقلص إلى 6,950 كم فقط. الخوارزمية المسطحة تجعل كثافة النقاط عند القطبين أكبر بـ 5.7 مرات مقارنة بخط الاستواء!
2. تحويل مارساغليا الكروي متساوي المساحة
لتوزيع النقاط بانتظام كامل على سطح الكرة، يجب أن تتناسب كثافة الاحتمال طردياً مع عنصر المساحة التفاضلي:
ولأن عنصر المساحة يتناسب مع d(sin θ)، نختار sin(θ) بانتظام تام في المجال [-1, 1]:
// ✅ 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 محاولة.
ولضمان إعادة إنتاج نفس النتائج، يدمج محركنا تجزئة cyrb53 بدقة 53-بت مع خوارزمية mulberry32، مما يضمن تطابق النتائج 100%.