L'algorithme du cube ne donnera pas une distribution uniforme sur la sphère - en particulier les zones proches des projections des coins auront la distribution la plus dense de points et près des centres des faces des cubes seront les plus basses.
Vous pouvez comprendre cela intuitivement puisque le volume du cube projeté sur la sphère sous-jacente est plus grand près des coins que près des centres des faces du cube. En fait, le volume d'un petit morceau (qui se projette sur un petit cercle sur la sphère) est proportionnel au cube de la taille du vecteur partant de l'origine et passant par le centre du petit cercle jusqu'au point de la sphère qu'il intersecte.
Ainsi, le volume relatif sur le centre d'une face de cube (comme (1,0,0)) est de 1, mais pour un coin (par exemple, (1,1,1)), c'est le cube de sqrt(3) ou 1,73 cubé, environ 5,2, donc presque 5 fois plus dense !
La fonction spreadPoints() pourrait faire un meilleur travail, mais je n'en suis pas sûr.
Il y a quelques erreurs dans votre JavaScript - l'utilisation de la fonction pow(..,-1) au lieu de acos(), des confusions sur les angles et l'absence de l'objet Math pour l'appel random()..,
Voici un JavaScript similaire mais correct pour faire ce que dit le lien Wolfram :
/*
Returns a random point of a sphere, evenly distributed over the sphere.
The sphere is centered at (x0,y0,z0) with the passed in radius.
The returned point is returned as a three element array [x,y,z].
*/
function randomSpherePoint(x0,y0,z0,radius){
var u = Math.random();
var v = Math.random();
var theta = 2 * Math.PI * u;
var phi = Math.acos(2 * v - 1);
var x = x0 + (radius * Math.sin(phi) * Math.cos(theta));
var y = y0 + (radius * Math.sin(phi) * Math.sin(theta));
var z = z0 + (radius * Math.cos(phi));
return [x,y,z];
}