Inicio > Programming, Shorts, Stat > Generar Números aleatorios entre 2 valores

Generar Números aleatorios entre 2 valores


En los últimos días me han preguntado 2 veces como generar números aleatorios entre 2 valores en SAS. Realmente la manera de generar estás secuencias de números aleatorios va más allá del software que estes utilizando, puede ser SAS, Ms Excel, Visual Basic, Java etc etc. La base es la misma. Aquí tienen un pequeño ejemplo.


La función o ecuación que vamos a utilizar es la siguiente:

Int((MaxValue – MinValue + 1) * Rnd) + MinValue

donde, MaxValue y MinValue son los valores extremos de cadena o secuencia de números aleatorios que se desean generar y Rnd es la distribución que deseamos utilizar, puede ser Uniforme, Normal, Poisson, Binomial, Weibull etc.

El siguiente ejemplo genera 100 números aleatorios uniformes entre 100 y 1000.

Data random;
do i=1 to 100;
secuencia=Int((1000 – 100 + 1) * ranuni(058212)) + 100;
output;
end;
run;

SASludos

Alberto

Categorías:Programming, Shorts, Stat
  1. agosto 25, 2009 a las 11:02 pm | #1

    Hola. muchas gracias. me has salvado la vida. Bueno, no tanto, pero sí me has ayudado mucho. Saludos.!implementado en java:public int[] random(int n, int low, int high) { int[] resultado = new int[n]; for (int i = 0; i < resultado.length; i++) { resultado[i] = (int) ((high – low + 1) * Math.random() + low); } return resultado; }

  2. Romina
    diciembre 9, 2011 a las 5:41 pm | #2

    holaaa me es muy util tu post en este momento! debo implementar esta funcion en java, mi unico problema es que no se como implementar la funcion ranuni y no la encuentro en ningun lado!!! te agradeceria mucho si pudieras ayudarme!!! muchas gracias
    Romina

    • diciembre 9, 2011 a las 7:06 pm | #3

      java:public int[] random(int n, int low, int high) { int[] resultado = new int[n]; for (int i = 0; i < resultado.length; i++) { resultado[i] = (int) ((high – low + 1) * Math.random() + low); } return resultado; }

  3. Romina
    diciembre 9, 2011 a las 9:44 pm | #4

    muchas gracias!!!!!!! me salvas la vidaaaa

  4. Raul
    febrero 8, 2012 a las 6:20 pm | #5

    Hola queria saber si puedes ayudarme. Estoy intentando generar numeros aleatorios con distribucion normal(no uniforme), entre [0,1] en lenguaje C. Pero toda la informacion que encuentro es para distribucion “uniforme”. Aqui tienes mi programa:

    for(i=0;i<500;i++)
    {;
    for(j=0;j<30;j++)
    {
    numAle[j] = rand()/((double)RAND_MAX);
    }

    sum = 0; ///////////////////////////////// Media de la distribucion
    for(j=0;j<30;j++)
    {
    sum = sum+numAle[j];
    }
    media = sum/30;

    suma = 0; ///////////////////////////////// Varianza
    for(j=0;j<30;j++)
    {
    suma = suma+pow((numAle[j]-media), 2);
    }
    varianza = suma/500;

    desv = sqrt(varianza); //////////////////// Desviacion

    r[i] = (media+desv*((sum-30/2)/pow(30/12, 0.5)));

    printf("R(%d)= %f\n", i, r[i]);
    }

    Espero que puedas ayudarme… Saludos!

    • febrero 8, 2012 a las 6:52 pm | #6

      Puedes convertir tu distribución uniforme en una distribución normal usando la transformación box-muller. Es super sencillo!

      http://en.wikipedia.org/wiki/Box_Muller_transform

      Avisame si te funciona.

      SASludos,

      Alberto

      • Raul
        febrero 9, 2012 a las 4:15 pm | #7

        Hola Alberto, gracias por contestarme anteriormente. He utilizado el metodo de Box-Muller:

        double BoxMuller()
        {
        int j, phase = 0;
        double Z, U1, U2, r[DIM];

        for(j=0;j<N1;j++)
        {
        if(phase == 0)
        {
        U1 = (double)rand()/RAND_MAX;
        U2 = (double)rand()/RAND_MAX;

        Z = sqrt(-2*log(U1))*cos(2*PI*U2);
        }
        else
        {
        Z = sqrt(-2*log(U1))*sin(2*PI*U2);
        }
        phase = 1-phase;
        r[j] = Z;
        }
        return r[j];
        }

        Pero me sigue creando una caminata aleatoria UNIFORME.

  5. Raul
    febrero 9, 2012 a las 6:47 pm | #8

    Ya consegui la distribucion normal, con caminata aleatoria no uniforme. Utilizando una variante del Metodo Box-Muller. Gracias por el apunte Alberto,

    Saludos!

    • febrero 9, 2012 a las 7:06 pm | #9

      Excellente! Si puedes comparte tu solución nosotros

      • Raul
        febrero 9, 2012 a las 9:19 pm | #10

        Este es el que me funciona:

        for(j=1;j= 1 || S == 0);
        r[j] = V1*sqrt(-2*log(S)/S);
        }
        else
        {
        r[j] = V2*sqrt(-2*log(S)/S);
        }
        phase = 1-phase;
        }

        Saludos!

  6. Raul
    febrero 9, 2012 a las 9:23 pm | #11

    No se que ha pasado antes, no aparece el codigo entero,

    for(j=1;j= 1 || S == 0);
    r[j] = V1*sqrt(-2*log(S)/S);
    }
    else
    {
    r[j] = V2*sqrt(-2*log(S)/S);
    }
    phase = 1-phase;
    }

  7. Raul
    febrero 9, 2012 a las 9:24 pm | #12

    Igual la ultima vez, lo siento pero no sale bien.

    • febrero 9, 2012 a las 10:31 pm | #13

      No te preocupes! Tienes album link q explica la transformación que utilizaste?

      Gracias!

      Alberto

      • Raul
        febrero 10, 2012 a las 3:53 pm | #14

        Aquí os dejo el link de donde lo saqué. El punto número 2 es el que tu me aconsejaste, pero no tiene un buen uso computacional. El que utilicé yo es el número 3, mucho más eficiente.

        http://c-faq.com/lib/gaussian.html

        Lo que hice es meterlo dentro de un bucle “for”, para generar un vector de números aleatorios y poder crear la caminata aleatoria.

        Tambien comentar que tube que cambiar la semilla del rand
        para que no fuera pseudo-aleatoria.

        srand((int) time(0));

        Esto se pone al principio del main() fuera de cualquier bucle, para que no haya problemas.

        Saludos!

  1. Aún no hay trackbacks

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.