| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 961
| Publicado: 11/12/2010 6:47 am | | | Título: Crear random con distribución no uniforme. |
| Buenas, me preguntaba sobre como se podrían generar randoms que no tengan una probabilidad uniforme para todos los números sino cualquier otro tipo de distribución como la normal.
Estoy googleando pero de momento no he encontrado nada satisfactorio.
Un saludo! |
| | Volver arriba | |  | iostream
Registrado: 26 Nov 2008 Mensajes: 38
| Publicado: 05/02/2011 2:21 am | | | Título: |
| Saludos Pantalàimon_ Sin duda alguna has planteado un ejercicio matemático muy interesante. He llegado al siguiente fragmento de código:
| Código: | float RandomNormal( float fMedia , float fSigma ) { //Variables float dZ = 0.01, //Diferencial de Z fIntegral = 0, //CDF Z=-4, //Variable tipificada fX, fAleatorio; time_t Tiempo; fAleatorio = ((clock())%1000)/1000.0f; //Integrar la función (CDF) //Cumulative Distribution Function while ( fIntegral <= fAleatorio ) { fIntegral+= (1.0f/(sqrt( 2.0f * 3.141592f )))* ( exp( -0.5*pow(Z,2.0f) ) ) * dZ; Z+=dZ; } //Destipificar la Variable Z fX = fSigma*Z + fMedia; return fX; }
|
Imagino que estará bien porque tanto el razonamiento como la prueba informática parecen adecuados. Colocaré el procedimiento matemático en breve para que constituya una explicación al código. Espero que esto te sirva.
Suerte! |
| | Volver arriba | |  | iostream
Registrado: 26 Nov 2008 Mensajes: 38
| Publicado: 05/02/2011 6:40 am | | | Título: |
| Cuando un ordenador genera un número aleatorio, crea un espacio muestral limitado por dos limites, discreto y equiprobable. Sin embargo, en el caso de una distribución normal el entorno no es limitado, ni equiprobable, ni discreto. Esto supone, que la probabilidad de ocurrencia de un suceso concreto es 0. Para solventar esta desconcordancia de distribución discreta-continua se consideran resultados en intervalos dentro de la distribución normal. Es decir: En lugar de considerar: "La probabilidad de que salga 1.54 es ... " se considera "La probabilidad de que salga un valor comprendido entre 1.50 y 1.60 es ...". Esto es posible porque la probabilidad de un suceso en un intervalo determinado es el área bajo la curva de Gauss(de distribución normal).
Mirando la imagen anterior vemos que entre -1 y 1 la probabilidad de suceso es de 68%, entre -2 y 2 un 95%...
¿Qué hacer? Debemos crear un entorno determinado, de forma que la probabilidad de suceso no sea uniforme sino que se ajuste a esa probabilidad. Por ejemplo:
{1,2,3,4,5,6,7,8}. La probabilidad de que el valor obtenido este entre 3 y 6 es mayor de que se encuentre entre 1 y 2. Porque la probabilidad del primer caso es 4/8 = 0.5 mientras que en el segundo caso es 2/8 = 0.25
Aproximemonos más:
Supongamos, que cogemos todos esos rectangulos y los tumbamos todos colocandolos horizontalmente. Cada uno unido al que le sigue en la grafica. De esta forma, en el centro de esta gran linea de rectángulos que hemos hecho, se encontrarán los dos más largos, y progresivamente segun vamos hacia los extremos, se van haciendo más pequeños. Pues bien, esta recta de rectangulos tiene una longitud determinada, llamemosla "L". Si yo elijo un número al azar entre el 0 y L, la probabilidad de que caiga en el intervalo del medio es mayor ya que se forma por los rectangulos de mayor longitud. Y la probabilidad de que caiga en los extremos es mínima.
Entendido hasta aquí? En caso de duda hazmelo saber.
Continuemos:
Todo eso de los rectangulitos está muy bien, pero. Si digo un numero entre 0 y L, cómo se a que rectangulito pertenece, y por tanto, a qué valor de la distribución?. Pues para saber esto debo sumar el conjunto de rectangulos. Con una Integral. Si hago una integral entre -? y un valor "k" obtendré el área bajo la curva en ese intervalo de la x: La longitud que ocupan el conjunto de rectangulos desde -? y k. Si como he dicho antes, elijo aleatoriamente un valor entre 0 y L, este valor tendrá una longitud M asociado a una probabilidad determinada. (Tal vez esto sea lo más dificil de entender y de explicar). Así que La integral de la función para un Z desconocido tiene que ser igual a un valor aleatorio M. obteniendo ese Z, podemos invertir la tipificación de la variable aleatoria en funcion de u y ?, obteniendo un valor para X.
En definitiva: Menudo lio
He realizado algunas comprobaciones, calculando la media de un conjunto de resultados, y tiende a u
Espero que con el código y la explicación haya satisfecho tu duda. Si se te plantea alguna vacilación hazme participe.
Saludos! |
| | Volver arriba | |  | | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 961
| Publicado: 17/04/2011 9:11 am | | | Título: |
| Uff! ahora veo esta respuesta... Muchas gracias iostream. Lo miraré con más detalle pero parece que ya he entendido la idea y hasta la he podido generalizar.
Sea f(x) la función densidad de probabilidad. Su integral de menos infinito a infinito debe ser 1. Entonces crear una función random con la probabilidad correspondiente a esa densidad de probabilidad f(x) se debe hacer lo siguiente:
1) Asignamos a una variable fAleatorio un numero real en el intervalo [0,1]. Dicho número se debe obtener de una distribución uniforme entre 0 y 1.
2) Hallar Z = F?¹(fAleatorio). Donde F(Z) = integral de -infinito a Z de la función f(x).
El segundo paso se deberá hacer usando integración numérica o no según el caso.
Un saludo y gracias retrasadas! |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |