Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Calculo de media y varianza

Estas en el tema de Calculo de media y varianza en el foro de C/C++ en Foros del Web. 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. ...
  #1 (permalink)  
Antiguo 19/08/2013, 15:53
 
Fecha de Ingreso: agosto-2013
Mensajes: 2
Antigüedad: 11 años, 4 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]);
    }
}
  #2 (permalink)  
Antiguo 21/08/2013, 05:54
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 6 meses
Puntos: 73
Respuesta: Calculo de media y varianza

Para empezar, comprueba el valor de RAND_MAX. Búscalo en el archivo stdlib.h, en la carpeta include dentro de la carpeta de instalación de tu compilador (que, por cierto, no indicas cuál es). Lo más probable es que esté definido como 0x7FFF (= 32767), con lo que, si necesitas generar más números aleatorios que esta cantidad, vas a obtener valores repetidos. Lo que ocurre es que los generadores de números aleatorios que tienen implementados muchos compiladores C/C++ tienen este mismo problema (ya viene de la época del IBM-PC de 16 bits), te puedo decir que yo tengo instalado Codeblocks 12.11 con MinGW (compilador gcc version 4.7.1, bastante reciente) y también le ocurre. La solución es utilizar un generador de números aleatorios más eficiente, podrás encontrarlos en internet (incluso con código fuente).

Sobre lo que dices de la varianza, ten en cuenta que la varianza no tiene que tender a cero, a grosso modo es la media de los cuadrados de las diferencias con la media y siempre será un valor positivo distinto de cero (salvo el improbable caso de que todas las muestras tengan exactamente el mismo valor).

Etiquetas: calculo, funcion, int, media, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:03.