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:
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
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; }
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
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; }
muchas gracias!!!!!!! me salvas la vidaaaa
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!
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
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.
Ya consegui la distribucion normal, con caminata aleatoria no uniforme. Utilizando una variante del Metodo Box-Muller. Gracias por el apunte Alberto,
Saludos!
Excellente! Si puedes comparte tu solución nosotros
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!
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;
}
Igual la ultima vez, lo siento pero no sale bien.
No te preocupes! Tienes album link q explica la transformación que utilizaste?
Gracias!
Alberto
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!