Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/08/2013, 15:53
zhisi
 
Fecha de Ingreso: agosto-2013
Mensajes: 2
Antigüedad: 10 años, 8 meses
Puntos: 0
Calculo de media y varianza

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