¿Cómo generar números aleatorios normales mediante UDF fluido?
El primer algoritmo genera 12 funciones aleatorias con una distribución promedio (0, 1), que pueden simular la distribución normal usando el teorema de los números grandes.
El segundo algoritmo utiliza la transformación jacobiana en matemáticas para generar directamente una distribución normal, pero este algoritmo no es adecuado para calcular números a gran escala.
Se producirá un error de desbordamiento.
Programa de prueba:
# include & ltmath.h & gt
# include & ltstdio.h & gt
# include & ltconio.h & gt
# include & ltstdlib.h & gt
# include & lttime.h & gt
double _random()(void)
{
int a;
Doble r;
a = rand()()% 32767
r =(a+0.00)/32767.00;
return r;
}
double _sta (doble departamento de gestión, doble sigma)
{
int I;
doble r, suma = 0.0
if(sigma<=0.0) { printf("Sigma< =0.0 en _sta ! "); salida(1);}
for(I = 1; i<=12;i++)
suma = suma+_ aleatorio() ();
r =(sum-6.00)* sigma+mu;
return r;
}
double _sta2(Doble gestión, doble sigma)
{
doble r1, R2;
r 1 = _ aleatorio()();
R2 = _ rand() om();
Devuelve sqrt(-2 * log(r 1))* cos(2 * M _ PI * R2)* sigma+mu;
}
int main()
{
int I;
Doble mu, sigma
srand()((sin firmar )tiempo(NULL));
mu = 0.0
sigma = 1.0;
printf("Algoritmo 1:\ n ");
for(I = 0;i<10;i++)
printf("%lf\t ",_sta(mu,sigma));
printf("Algoritmo 2: \ n ");
for(I = 0;i<10;i++)
printf("%lf\t ", _sta2(mu, sigma));
Devuelve 0;
}
//Obtiene un número aleatorio distribuido normalmente a partir de un número aleatorio distribuido uniformemente.
# include & ltmath.h & gt
Desarrollo de gas flotante (idum)
int * idum
{
static int iset = 0;
gset de punto flotante estático
float fac, r, v1, v2
float ran 1();/ / Genera números aleatorios distribuidos uniformemente, que pueden anularse con funciones del sistema.
if (iset == 0) {
Haz {
v 1 = 2.0 * ejecutó 1(idum)-1.0;
v2 = 2.0 * corrió 1(idum)-1.0;
r = v 1 * v 1+v2 * v2;
} while(r & gt; = 1.0);
fac = sqrt(-2.0 * log(r)/r);
gset = v 1 * fac;
iset = 1;
Devolver v2 * fac
} En caso contrario {
iset = 0;
Devolver gset
}
}