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]); } }