rango - generar numeros aleatorios en un arreglo en c++
¿cómo generar números pseudoaleatorios gaussianos en c para una media y varianza dada? (2)
Aquí tengo un código que genera números aleatorios con una media de 0f 1 y una desviación estándar de 0.5. pero ¿cómo modifico este código para poder denegar los números aleatorios gaussianos de cualquier media y varianza?
#include <stdlib.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
double drand() /* uniform distribution, (0..1] */
{
return (rand()+1.0)/(RAND_MAX+1.0);
}
double random_normal()
/* normal distribution, centered on 0, std dev 1 */
{
return sqrt(-2*log(drand())) * cos(2*M_PI*drand());
}
int main()
{
int i;
double rands[1000];
for (i=0; i<1000; i++)
rands[i] = 1.0 + 0.5*random_normal();
return 0;
}
Hay varias formas de hacerlo, todas las cuales implican básicamente transformar / mapear sus valores uniformemente distribuidos a una distribución normal / gaussiana. Una transformación Ziggurat es probablemente la mejor opción.
Una cosa a tener en cuenta: la calidad de su distribución final es tan buena como su RNG, así que asegúrese de usar un generador de números aleatorios de calidad (p. Ej., Twister Mersenne) si la calidad de los valores generados es importante.
Aquí tengo un código que genera números aleatorios con una media de 0f 1 y una desviación estándar de 0.5. pero ¿cómo modifico este código para poder denegar los números aleatorios gaussianos de cualquier media y varianza?
Si x
es una variable aleatoria de una distribución gaussiana con media μ
y desviación estándar σ
, entonces αx+β
tendrá una media αμ+β
y una desviación estándar |α|σ
.
De hecho, el código que publicó ya hace esta transformación. Comienza con una variable aleatoria con media 0 y desviación estándar 1 (obtenida de la función random_normal
, que implementa la transformación Box-Muller ), y luego la transforma en una variable aleatoria con media 1 y una desviación estándar de 0,5 (en la matriz de rands
) a través de la multiplicación y la adición:
double random_normal(); /* normal distribution, centered on 0, std dev 1 */
rands[i] = 1.0 + 0.5*random_normal();