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;
このコードは一見正しく見えますが、すべての緯度帯が同じ物理面積を持つと誤認しています。実際の球体では緯度線の長さはcos(緯度)で縮みます:
赤道(0°)の全周は約40,075kmですが、北緯80°ではわずか6,950kmです。単純な平面乱数では、北極周辺の点の密度が赤道の5.7倍にも膨れ上がってしまいます!
2. Marsaglia等面積球面正弦変換アルゴリズム
球面上に均一な点を生み出すには、確率密度を表面積の微小要素に正確に比例させる必要があります:
微小面積要素は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乱数生成器を組み合わせ、同一シードから100%同一の結果を保証します。