2011-09-05 36 views

Respuesta

11

uniforme:
generar un número aleatorio en el rango [0,1] con uniform distribution:

double X=((double)rand()/(double)RAND_MAX); 

Exponentional
generar una exponentional random variable con el parámetro lambda:

-ln(U)/lambda (where U~Uniform[0,1]). 

normal:
la manera más simple [aunque consume mucho tiempo] es usar central limit theorem, [suma suficientes números uniformemente distribuidos] pero hay otros métodos en el wikipedia page como el box muller transform que genera 2 variables aleatorias independientes: X, Y ~ N (0, 1)

X=sqrt(-2ln(U))*cos(2*pi*V) 
Y=sqrt(-2ln(U))*sin(2*pi*V) 
where U,V~UNIFORM[0,1] 

transformación de X ~ N (0,1) a Z ~ N (m, s^​​2) es simple: Z = s*X + m

aunque se puede generar estos números al azar, yo estoy por @ Amigable sugerencia de Clark Kant para utilizar una biblioteca existente.

+0

Si la plataforma es compatible con C++ 11, está disponible la nueva y potente función de números aleatorios. Ya es compatible con 20 distribuciones comunes. Consulte las [Preguntas frecuentes sobre C++ 11] (http://www.stroustrup.com/C++FAFA.html#std-random). – ManuelAtWork

Cuestiones relacionadas