Buenas gente! Como va todo?
Bueno, hoy les vengo con un problema matemático a ver si me pueden dar una mano.
El tema es así, estoy trabajando con generadores pseudoaleatorios, en definitiva como deben saber ya uds, son funciones determinísticas que generan una salida de números que imitan la aleatoriedad real.
Esto se logra con funciones discretas, es decir, congruenciales.
Bueno, el chiste de los PRNGs es que si uno crea un gráfico de distribución, se va a dar cuenta que tienen distribución uniforme, es decir que cada caracter sale más o menos la misma cantidad de veces. El gráfico se vería parecido a este:
(http://i.msdn.microsoft.com/dynimg/IC169495.gif)
La idea, es que estaba buscando una manera eficiente de sin tocar la fórmula del PRNG original, agregarle algo (por ejemplo multiplicarlo por un valor o dividirlo) a dicha fórmula para que la distribución, se vea más gaussiana, es decir parecida a esta:
(http://www.emeraldinsight.com/content_images/fig/1120130402004.png)
Cree una función en base a la función gaussiana original que muestra como me gustaría que quede la distribución, esta fórmula es:
e^(-(x-mean)^2*(sdev^2)*0,5)
Siendo mean = 127,5 y sdev=0,01.
Si uno grafica esta fórmula, va a ver una función gaussiana pero con un dominio (0;1] y una imagen (-inf;+inf).
Para el PRNG, me gustaría que la distribución se aproxime a la curva generada por la imagen [0;255] de dicha función.
Se que suena complicado, pero estoy seguro que algún aficionado a las matemáticas me puede dar una mano.
Muchas gracias!!
Un abrazo
APOKLIPTICO.
invoco a nyu >_< el puede ayudarte :O
A nadie se le ocurre nada??
Digan algo, aunque suene disparatado.
Digan algo, aunque suene disparatado.
disparate:
no se mucho de matematica pero quizas te sirva probar con valor absoluto del coseno.
A ver, explicate un poco más, como lo aplicaría?
Desde el punto de vista de la informática en este tema ni idea, pero desde el punto de vista puramente estadístico. Con eso que dices de obtener una forma más gaussiana supongo que te refieres a obtener una distribución normal (0;1) lo que debes hacer es tipificar para obtener una distribución estandarizada.
Pero pasar del modelo uniforme [a,b] al normal (0;1) nunca lo he hecho, no tienen un comportamiendo homogéneo, no se tratan de intervalos los 2 modelos, así que ni idea xd
Supongo que te resulta algo abstracto todo lo que he dicho porque así es la estadística pero no sé cómo ayudarte, lo siento.
Todo ayuda, todo ayuda, la idea es modificar la fórmula, ya sea multiplicando, sumando o lo que haya que hacer, de tal manera que los valores que salgan salgan con una distribucion normal, es decir, que los de el centro (127,128), salgan más que los de las puntas (0 y 255).
@APOKLIPTICO
No es por hacer spam, pero hay un foro excelente de matemáticas en donde te pueden ayudar mejor:
http://rinconmatematico.com/foros/
Leo, para nada creo que sea SPAM, me registré recién, pero por alguna razón, no me llegó el mail de activación, te molestaría activarme la cuenta manualmente?
Muchas gracias.
Para nada, comentame por MP para hacerlo.
Si divides la formula entre la media (mean) y le sumas lo que sea para que te quede centrada donde quieras? Así como idea rápida, cómo la ves?
Nop, creo que no nos estamos entendiendo, la fórmula sólo muestra cómo debería verse la distribución del PRNG, la salida del prng que es una fórmula modular: x(n+1) = (x(n) * a + k) mod m, devuelve números pseudoaleatorios dependiendo del número semilla.
La idea es modificar la fórmula del PRNG, para que los valores que devuelva, tengan una distribución aproximada a la de la fórmula de la distribución.
hola amigo como estas.....si mal no recuerdo....para pasar datos de una muestra uniforme y "normalizarla" se devia usar la funcion "T-studend" aca te dejo un enlace...pero mas alla de lo dificil que parece....en la practica solo debes calcular la varianza, media de la muestra y el resto es cambiar las letritas por los numeros que te da ojo usar la media q corresponde hay media para intervalos y para puntos
http://es.wikipedia.org/wiki/Distribuci%C3%B3n_t_de_Student (http://es.wikipedia.org/wiki/Distribuci%C3%B3n_t_de_Student)
editado
traduccion al castellaño de la utilizacion de t :laugh: :laugh: :laugh:
**grado de libertad=>cantidad de datos conocidos (media y varianza poblacionales no de una muestra)
**desviación típica de los datos S=>la conocida varianza de la muestra se le saca la raiz cuadrada
**intervalo de confianza => intervalo donde caeria la media (cambiar datos obtenidos previamente)
**media = x media +- t (alfa/2) multiplicado por (S/(raíz cuadradada de n) => en la parte mas menos o sea lo sumas y lo restas osea te da dos resultados el dato t lo sacas de la tabla calculando si tenes la media grado de libertad menos uno si no tenes ni la media ni la varianza (lo mas general) grado de libertad menos dos
este enlace esta mejor explicado http://es.wikibooks.org/wiki/Tablas_estad%C3%ADsticas/Distribuci%C3%B3n_t_de_Student (http://es.wikibooks.org/wiki/Tablas_estad%C3%ADsticas/Distribuci%C3%B3n_t_de_Student)
editado2
ojala no sea muy chino lo que explique :xD
ya que me invocaron, si aun no lo has podido resolver con lo que te dijo flony
De lo que te entendi buscas basicamente que los valores extremales de la funcion esten aproximadamente en el centro(maximos) de la grafica y en sus extremos(minimos)
estuve pensando en una solucion general pero sin saber la cantidad de numeros seudoaleatorios a generar no se me ocurrio nada para hacerlo directamente quiza si alla pero no se me ocurrio como al menos por ahora.
Si estas interesado en sacar una solucion general revisate el capitulo 2 de esto: http://etd.lib.fsu.edu/theses/available/etd-10312005-131627/unrestricted/DissertationWenboHu.pdf
No lo he leido muy a fondo pero puede ser que ahi te de una idea de como hacerlo.
Con unas cuantas restricciones si se me ocurrio una idea que quiza te pueda servir, eso si puede ser que requieran mas calculos que la funcion aleatoria misma, pero eso ya seria cosa de optimizarlas
Ahora si suponemos que:
yi=numero seudoaleatorio i
f(y)=funcion seudoaleatoria= s
La idea, tomando como valido lo siguiente:
La cantidad de numeros seudoaleatorios se conoce o se puede calcular directamente, con esto me refiero a que tu le dices al programa genera "s" (donde s pertenece a los naturales union el 0) numeros seudoaleatorios
Asignate cuando si=1 f(s)=-a(donde a es una constante de tu eleccion), cuando si=s/2 f(s)=0 y cuando si=s f(s)=a y a los numeros si tal que s no es 1, s/2 o s asignales el valor (2*a*si/s)-a claro que para simplificar se puede elegir 1 de constante a y para mejor presentacion se puede crear la funcion sin asignar los 3 valores iniciarles, pero al menos esa sirve para normalizar el intervalo, lo que hace basicamente es mandar
si s=1....n
f(s)∈[-a,a]
claro que para simplificar
si s=1....n
f(s)=(2*a*si/s)-a entonces f(s)∈(-a,a) sin necesidad de definir constantes y
f(s)=(2*si/s)-1 entonces f(s)∈(-1,1)
el punto de esto es mandar s=1....n en un intervalo,
ya mandado ahora solo necesitas una funcion gaussiana, claro que la distribucion normal estandar te puede servir, (http://i56.tinypic.com/ajuf60.png) la constante 1/(2 raiz de pi) lo que hace es hacer que el maximo sea 1 entonces si usas 255(1/(2 raiz de pi)) la multiplicas por 255 la que mencionaste igual puede servir ya es cosa de que la elijas tu
supongo que no te causaria nada de problemas usar la funcion normal estandar o una similar a el nuevo dominio de f(s) asi que no tiene caso que lo explique, pero si acaso solo se trata de valuar f(s) en la funcion que tu elijas
y bueno ahora que ya calculaste f(s) y le aplicaste tu funcion tienes una grafica gausianna de exactamente s elementos y como s tu funcion generadora de numeros seudo aleatorios al aplicarla obtienes lo que buscas
Como notas, si siempre es la misma cantidad de elementos s, la mayoria de lo que escribi no es necesario xD y si la cantiadad de numeros seudoaleatorios a generar es desconocida por ti y por el programa probablemente al menos por este metodo no se si tenga una solucion pero calcularlo mas complicado ya que al no saber la cantidad de elementos totales no se puede asignar una funcion que lo mande al dominio correcto con eficacia de 100% se puede adivinar y con metodos probabilisticos si se puede mejorar mucho esa aproximacion dependiendo de lo que se conoce de la cantidad a generar
Bueno espero que te sirva de algo, saludos!