Difference between revisions of "Random Gaussian Number Generator"
Jump to navigation
Jump to search
m (→3D) |
m (<lsl> tag to <source>) |
||
Line 1: | Line 1: | ||
Port of the Random Gaussian algorithm found on http://www.taygeta.com/random/gaussian.html<nowiki>.</nowiki> | Port of the Random Gaussian algorithm found on http://www.taygeta.com/random/gaussian.html<nowiki>.</nowiki> | ||
< | <source lang="lsl2">float randGauss(float mean, float stdev){ | ||
float x, y, r2; | float x, y, r2; | ||
do{//Generate a point in a unit circle that is not zero. | do{//Generate a point in a unit circle that is not zero. | ||
Line 11: | Line 11: | ||
//Box-Muller transformation | //Box-Muller transformation | ||
return mean + x * stdev * llSqrt( -2 * llLog(r2) / r2); | return mean + x * stdev * llSqrt( -2 * llLog(r2) / r2); | ||
}</ | }</source> | ||
< | <source lang="lsl2">vector randGaussPair(vector center, float stdev){//2D | ||
//returns a random point on the x/y plain with a specified standard deviation from center. | //returns a random point on the x/y plain with a specified standard deviation from center. | ||
float r2; | float r2; | ||
Line 24: | Line 24: | ||
//Box-Muller transformation | //Box-Muller transformation | ||
return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2))); | return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2))); | ||
}</ | }</source> | ||
==Box-Muller Transformation== | ==Box-Muller Transformation== | ||
Line 31: | Line 31: | ||
==3D== | ==3D== | ||
Is this correct? Or does Box-Muller need to be adjusted? | Is this correct? Or does Box-Muller need to be adjusted? | ||
< | <source lang="lsl2">vector randGaussPoint(vector center, float stdev){//3D | ||
//returns a random point with a specified standard deviation from center? | //returns a random point with a specified standard deviation from center? | ||
float r2; | float r2; | ||
Line 42: | Line 42: | ||
//Box-Muller transformation | //Box-Muller transformation | ||
return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2))); | return center + (p * (stdev * llSqrt( -2 * llLog(r2) / r2))); | ||
}</ | }</source> |
Latest revision as of 07:43, 25 January 2015
Port of the Random Gaussian algorithm found on http://www.taygeta.com/random/gaussian.html.
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);
}
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)));
}
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? Or does Box-Muller need to be adjusted?
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)));
}