Random Gaussian Number Generator

From Second Life Wiki
Revision as of 15:33, 26 December 2010 by Strife Onizuka (talk | contribs) (Needed to be attributed since it is a well known algorithm. Couldn't help but expand upon what was already provided.)
Jump to navigation Jump to search

Port of the Random Gaussian algorithm found on http://www.taygeta.com/random/gaussian.html.

<lsl>float randGauss(float mean, float stdev){

   float x, y, r2;
   do{//Generate a point in a unit circle that is not zero.
       x = llFrand(2.) - 1;
       y = llFrand(2.) - 1;
       r2 = x * x + y * y;
   } while (r2 > 1.0 || r2 == 0);
   //Box-Muller transformation
   return mean + x * stdev * llSqrt( -2 * llLog(r2) / r2);

}</lsl>

<lsl>vector randGaussPair(vector center, float stdev){//2D

   //returns a random point on the x/y plain with a specified standard deviation from center.
   float r2;
   vector p;
   do{//Generate a point in a unit circle that is not zero.
       p = <llFrand(2.) - 1, llFrand(2.) - 1, 0>;
       r2 = p * p;//dot product
   } while (r2 > 1.0 || r2 == 0);
   //Box-Muller transformation
   return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2)));

}</lsl>

Box-Muller Transformation

The Box-Muller transformation is used to adjust the magnitude of the vector, remapping it to a standard deviation.

3D

Is this correct? <lsl>vector randGaussPoint(vector center, float stdev){//3D

   //returns a random point with a specified standard deviation from center?
   float r2;
   vector p;
   do{//Generate a point in a unit sphere that is not zero.
       p = <llFrand(2.) - 1, llFrand(2.) - 1, llFrand(2.) - 1>;
       r2 = p * p;//dot product
   } while (r2 > 1.0 || r2 == 0);
   //Box-Muller transformation
   return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2)));

}</lsl>