Hola. Tengo un programa que me calcula la media y la varianza de una serie de números generados aleatoriamente con un generador plano. Compila bien.
El programa genera 10 numeros aleatorios y calcula su media y su varianza, a continuación genera 10 números más y calcula la media y la varianza de los 20 numeros... así sucesivamente hasta que llega a unos 10^6 números generados.
El tema es que conforme aumenta la cantidad de números generados, la media debe tender a la media real del intervalo en el cual se han generado los números de forma aleatoria y la varianza a de tender a cero. La media da el resultado correcto, sin embargo la varianza tiende a 4 en lugar de tender a 0.
El intervalo en el que genero los números es entre -2 y 5 y la generación en primera instancia es de 10 números aleatorios.
A algun compañero le pasaba algo similar, pero no recuerdan exactamente cuál era el fallo, recuerdan un error en la sintaxis del algoritmo, pero llevo todo el día y no encuentro el error.
Muchas gracias.
Adjunto el código.
Código:
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATOS 100000
void med_var(double *serie, int numero, double *media, double *varianza);
double frandomN(double x_min, double x_max, int N, double *serie);
main()
{
srand(time(0));
int i;
double media, varianza, x_min, x_max;
double serie[MAX_DATOS];
FILE *med_var_dat;
printf("Seleccione el intervalo para el cual quiere generar numeros aleatorios: \n");
scanf("%lf %lf",&x_min,&x_max);
printf("\nIntroduzca el numero de datos que desea generar en primera instancia: \n");
scanf("%d",&i);
med_var_dat=fopen("medias y varianzas.dat","wt");
do{ //En la primera iteracion se generan i numeros aleatorios planos, y en las sucesivas se generan i+10 numeros
//aleatorios hasta un maximo de MAX_DATOS. La media y la varianza de cada iteracion es almacenada en un fichero.
//Pretendemos ver la evolucion de la media y la varianza al aumentar el numero de datos.
frandomN(x_min,x_max,MAX_DATOS,serie);
med_var(serie,i,&media,&varianza);
fprintf(med_var_dat,"%d %lf %lf\n",i,media,varianza);
i=i+10;
}while(i<MAX_DATOS);
fclose(med_var_dat);
}
void med_var(double *serie, int numero, double *media, double *varianza) //Entrada: serie de datos y numero de datos. Salida: media y varianza.
{
int i;
*media=0;
for(i=0;i<numero;i++)
{
*media+=serie[i];
}
*media=*media/numero;
*varianza=0;
for(i=0;i<numero;i++)
{
*varianza+=((serie[i]-(*media))*(serie[i]-(*media)));
}
*varianza=*varianza/(numero-1);
}
double frandomN(double x_min, double x_max, int N, double *serie) //Genera N numeros aleatorios planos double en el intervalo [x_min,x_max] (inputs de la funcion)
{
int i;
for(i=0;i<N;i++)
{
serie[i]=x_min+(x_max-x_min)*(rand()/((double)RAND_MAX+1));
printf("serie[%d]=%lf\n",i,serie[i]);
}
}