Difference between revisions of "Random Gaussian Number Generator"
Jump to navigation
Jump to search
(Created page with "<lsl> float randGauss(float mean=0.,float stdev=1.){ float V1,V2,S; do{ V1=2*llFrand(1.)-1; V2=2*llFrand(1.)-1; S=V1*V1+V2*V2; }while (S>=1); return mean+stdev*V1*llSqr…") |
(Needed to be attributed since it is a well known algorithm. Couldn't help but expand upon what was already provided.) |
||
Line 1: | Line 1: | ||
<lsl> | Port of the Random Gaussian algorithm found on http://www.taygeta.com/random/gaussian.html<nowiki>.</nowiki> | ||
float randGauss(float mean | |||
<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); | |||
} | |||
</lsl> | //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> |
Revision as of 14:33, 26 December 2010
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>