Если вы можете использовать новый стандарт c ++ 11, легко создать гауссово распределенные случайные числа.Затем вы можете использовать тот факт, что три одномерных гауссовых числа составляют одну трехмерную гауссову координату, которая равномерно распределена по сфере постоянного радиуса (радиус распределен по Гауссу).Если вы хотите, чтобы координаты были только на определенном радиусе, вы должны нормализовать ваши координаты.Вот как вы можете это сделать:
#include <iostream>
#include <random>
#include <cmath>
using namespace std;
int main (int argC, char* argV[])
{
//Create random generator
mt19937 rnd;
//Create Gaussian distribution
normal_distribution<double> normDist ( 0.0, 1.0 );
//Seed random generator
rnd.seed(time(NULL));
const double sphereRadius = 1;
//Create 3 Gauss Random Numbers
double rndArray[3];
double rndSqrSum = 0;
for ( uint i = 0; i < 3; i++ )
{
rndArray[i] = normDist( rnd );
rndSqrSum += rndArray[i] * rndArray[i];
}
//Calculate Faktor to get a Sphere of radius sphereRadius
double faktor = sphereRadius / sqrt( rndSqrSum ) ;
//The random Coordinates then are:
double x = rndArray[0]*faktor;
double y = rndArray[1]*faktor;
double z = rndArray[2]*faktor;
cout << "Koordinates are: " << endl << "x: " << x << endl << "y: " << y << endl << "z: " << z << endl << "Radius is: " << sqrt(x*x+y*y+z*z) << endl;
}
Для вашего приложения, вероятно, не нужно, но полезно, хотя, этот метод может быть использован для произвольных измерений, например.20 размерных задач.