Архимед доказал изящную теорему о том, что площадь области на сфере равна площади горизонтальной проекции этой области на изогнутую грань описывающего цилиндра (и, следовательно, в частности, площадь всей сферы равнаравна площади всей изогнутой поверхности описанного цилиндра).Вы можете убедить себя в этом, нарисовав маленькие «прямоугольники» (ограниченные линиями широты и долготы) и доказав это для них, затем наблюдая (неофициально), что на пределе все аппроксимируется достаточно маленькими прямоугольниками или, более формально, что областьобласти определяется как некоторый интеграл, т. е. (благодаря Лебегу) предел серии сумм прямоугольников.
Итак, если вы выберете случайную равномерно распределенную точку на изогнутой поверхности цилиндра(легко, поскольку он изометричен прямоугольнику), а затем проецирует эту точку горизонтально обратно на сферу, ваше распределение будет иметь свойство, согласно которому вероятность нахождения точки в любом регионе пропорциональна площади региона.
Это означает, что выберите долготу равномерно в диапазоне (-pi, pi] и установите широту на arccos(y) - pi/2
, где y равномерно распределен в диапазоне (-1,1].
Вы будетевсе еще имеют небольшое смещение благодаря (нехватке) точности любого типа с плавающей точкойиспользовать для arccos
.Я не уверен, будет ли это заметно, но если это так и если вы хотите исправить это, вы можете сделать свои значения y более точными, близкими к +/- 1 (фактически, генерируя больше битов после десятичной точки).Или, скорее, разделить диапазон на два, сгенерировать дополнительные биты, близкие к 0, а затем использовать точную функцию arccos_1_minus_x
.