📐 Guide & Démonstration Mathématique

Fonctionnement des Coordonnées Aléatoires : La Vérité Sphérique

Pourquoi la plupart des générateurs sont mathématiquement erronés et comment la projection équi-surface produit des points véritablement uniformes.

📐 Rigueur Mathématique

Distribution Sphérique Équi-Surface vs. Biais Polaire

La plupart des générateurs gratuits traitent la Terre comme un plan. Voici comment notre algorithme garantit une précision absolue.

❌ Grille Aléatoire Naïve (Erreur Répandue)

Incorrect
// ❌ Flat 2D Rectangular Bug:
const lat = (Math.random() * 180) - 90;
const lng = (Math.random() * 360) - 180;

Le Problème : Une bande de 1° à l’équateur mesure 40 075 km contre seulement 6 950 km à 80°N. Choisir la latitude uniformément surreprésente l’Arctique de 400%.

✅ Équi-Surface de Marsaglia (Notre Algorithme)

Vérifié & Exact
// ✅ Marsaglia Equal-Area Sphere Math:
const u = Math.random();
const lat = Math.asin(2 * u - 1) * (180 / Math.PI);
const lng = -180 + Math.random() * 360;

La Solution : Échantillonner le sinus de la latitude sin(θ) compense parfaitement la réduction de surface cos(lat). Chaque km² a la même probabilité.

1. L’Erreur Fondamentale de l’Hypothèse Rectangulaire

Sur une carte 2D (comme la projection Mercator), la Terre apparaît comme un rectangle plat où la latitude s’étend de -90° à +90° et la longitude de -180° à +180°.

De nombreux guides conseillent de générer les coordonnées ainsi :

// ❌ Naive algorithm (Suffers from polar bias bug)
const latitude = (Math.random() * 180) - 90;
const longitude = (Math.random() * 360) - 180;

Bien que ces nombres soient valides, ce code traite toutes les bandes de latitude comme ayant la même superficie. Sur une vraie sphère, la circonférence décroît avec le cosinus de la latitude :

Circumference(θ) = 2πR · cos(θ)

À l’équateur (0°), la circonférence est de 40 075 km. À 80° Nord, elle n’est plus que de 6 950 km. L’algorithme plat concentre 5,7 fois plus de points par km² aux pôles qu’à l’équateur !

2. La Transformation Sphérique Équi-Surface de Marsaglia

Pour générer des points uniformément répartis sur une sphère, la densité de probabilité doit être proportionnelle à l’élément de surface différentiel :

dA = R² · cos(θ) dθ dφ = R² · d(sin θ) dφ

Comme l’élément de surface est proportionnel à d(sin θ), nous pouvons échantillonner sin(θ) uniformément sur [-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 };
}

Cette transformation élégante garantit que chaque kilomètre carré sur Terre a exactement la même probabilité d’être sélectionné.

3. Échantillonnage par Rejet Terrestre et Reproductibilité PRNG

Environ 71 % de la Terre est recouverte par les océans. Quand l’utilisateur demande uniquement la terre ferme, nous utilisons l’échantillonnage par rejet :

  1. Générer un point sphérique équi-surface.
  2. Vérifier la position contre les polygones vectoriels des continents.
  3. Si le point tombe en pleine mer, le rejeter et régénérer jusqu’à 250 tentatives.

Pour la reproductibilité, notre moteur combine un hachage cyrb53 53 bits et un PRNG mulberry32 32 bits, assurant des résultats 100% déterministes.