1. 평면 직사각형 가정의 근본적 기하 결함
2차원 평면 지도(메르카토르 등)에서 지구는 위도 -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,075km이지만 북위 80°에서는 6,950km에 불과합니다. 단순 평면 난수는 극지방의 점 밀도를 적도보다 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 };
}이 우아한 수학적 변환을 통해 지구상의 모든 1제곱킬로미터가 정확히 동일한 선택 확률을 갖게 됩니다.
3. 육지 기각 샘플링 및 PRNG 결정론적 재현성
지구 표면의 약 71%는 해양입니다. 육지 전용 모드에서는 효율적인 기각 샘플링을 적용합니다:
- 등면적 구면 좌표점 1개를 생성.
- 대륙 폴리곤 벡터 데이터와 고속 교차 판정.
- 해양에 위치할 경우 폐기하고 최대 250회까지 자동 재생성.
연구와 재현성을 위해 53비트 cyrb53 해시와 32비트 mulberry32 PRNG를 결합하여 동일 시드에서 100% 동일한 좌표 출력을 보장합니다.