Random generator: various distributions
An approximation of various distributions
HTML
<div id="container"></div>
CSS
#container {
position: relative;
width: 400px;
height: 500px;
border: 1px solid #000;
}
#container div {
position: absolute;
bottom: 0;
width: 2px;
}
JavaScript
var RANDOM = { //returns random between -1 and 1
"norm": function(n) {
if (!(n > 2 && n <= 5)) n = 2;
var nrand = 0;
n = Math.floor(n);
for (var i = 1;i<=n*2;i++){
nrand += Math.random();
}
return (nrand - n) / n;
},
"inorm": function(n) {
if (!(n > 2 && n <= 5)) n = 2;
var nrand = 0;
n = Math.floor(n);
for (var i = 1;i<=n*2;i++){
nrand += Math.random();
}
return (1 - Math.abs((nrand-n) / n))*(Math.abs(nrand-n)/(nrand-n));
},
"exp": function(n) { //mostly -1
if (!(n > 2 && n <= 5)) n = 2;
var nrand = Math.random();
for (var i = 2;i<=n;i++){
nrand *= Math.random();
}
return 2*nrand-1;
},
"invexp": function(n) { //mostly 1
if (!(n > 2 && n <= 5)) n = 2;
var nrand = Math.random();
for (var i = 2;i<=n;i++){
nrand *= Math.random();
}
return (2*(1-nrand)-1);
},
"gamma3": function(alpha) { //Kundu and Gupta algorithm 3 http://home.iitk.ac.in/~kundu/paper120.pdf
if (!alpha || Math.abs(alpha) > 1) alpha = 1; //alpha between 0 and 1
var d = 1.0334 - (0.0766*Math.exp(2.2942*alpha));
var a = Math.pow(2,alpha)*Math.pow(1-Math.exp(-d/2),alpha);
var b = alpha*Math.pow(d,alpha-1)*Math.exp(-d);
var c = a + b;
var U = Math.random();
var X = (U <= a/(a+b)) ? -2*Math.log(1-(Math.pow(c*U,1/alpha)/2)) : -Math.log(c*(1-U)/(alpha*Math.pow(d,alpha-1)));
var V = Math.random();
if (X <= d) {
var mess = (Math.pow(X,alpha-1)*Math.exp(-X/2))/(Math.pow(2,alpha-1)*Math.pow(1-Math.exp(-X/2),alpha-1));
if (V <= mess) return X-1;
else return this.gamma3(alpha);
} else { //X > d
if (V <= Math.pow(d/X,1-alpha)) return X-1;
else return this.gamma3(alpha);
}
//output is > 0 and possibly > 1
},
"gamma": function(alpha,beta) { //Martino and Luengo http://arxiv.org/pdf/1304.3800.pdf luca@tsc.uc3m.es luengod@ieee.org
if (!alpha || alpha <= 0) alpha = 1; //alpha >= 1 if negative or 0
if (alpha > 0 && alpha < 1) return RANDOM.gamma3(alpha); // use different algorithm
if (!beta || beta <= 0) beta =...