Hola que tal... ando pensando y mi cabeza no da para nada de nada...
Tengo una duda
Supongamos que yo quisiera regalar una camisa... cogidas de tres tipos baja calidad, media calidad y alta calidad.
Pero al sortear io quiero que la de baja calidad tenga mayor probabilidad de salir.
Se que usando la base de datos podria hacerlo, pero... tendria que poner mas beses la de baja calidad?.
Pregunto esto porque en algunos juegos donde los monstruos te arrojan dinero y objetos como armas ropa etc etc
cuando caen. no caen todas sino al azar... pero caen o bien arma o bien ropa. o a veces no cae ninguna.
Cuando cae dinero supongamos cae en un rango de 10monedas a 20 monedas. pero es mas probable que te caiga una de 10 que una de 20... no se si me explique bien.
de antemano gracias
Salu2

Valor aleatorio con probabilidades
Comenzado por
Anewryzm
, jul 01 2012 12:17
3 respuestas en este tema
#1
Escrito 01 julio 2012 - 12:17
#2
Escrito 01 julio 2012 - 04:56
Por ejemplo
$a = rand(1,100);
if ($a<=10) {
echo "Camisa con 10% de probabilidad";
} else
if ($a<=30) {
echo "Camisa con un 20% de probabilidad";
} else
if ($a<=60) {
echo "Camisa con un 30% de probabilidad";
} else {
echo "No te ha tocado premio";
}
#3
Escrito 01 julio 2012 - 01:14
Hola Anewryzm,
Lo puedes encarar de forma simple aplicando condicionales (ya sea ifs o cases) a como el ejemplo de seoane, o bien como algo más formal, técnico y ni que decir... académico. No se que tan al tanto estás de los conceptos de Distribuciones de probabilidad y funciones de Densidad/Probabilidad y de variables aleatorias.
En resumen, lo que dicen esos conceptos chinescos es que se puede obtener una variable aleatoria dependiendo de una función de distribución de probabilidad dado un valor aleatorio (obtenido por un generador, como Random). Matemáticamente,
X = F(D1 ... Dn, , R);
Siendo X el valor que deseamos obtener, D1 a Dn los datos básicos necesarios para la función F de la distribución de probabilidad D y R el valor aleatorio obtenido en en generador cuyo rango es [0,1)
El problema es que generalmente se explica a las cosas al revés,
R = f(X, D1 ... Dn)
Es decir obtener la probabilidad para el Dato X según la distribución. Tu necesitas su inversa F.
Debes pensar, si lo quieres ver de este modo, que distribución de probabilidad es la más adecuada a esperar para tu caso. Hay diferentes distribuciones: Uniforme, Normal, Exponencial, Student, Weibull por mencionar algunas. Las más habituales son Uniforme, Normal y Exponencial ya que son las que más abundan en la vida cotidiana. El resto de las distribuciones son casos especiales de Normal o de Exponenciales o tienen otros usos.
Uniforme
Esta distribución lo que hace es asignar la misma probabilidad para todos los valores de un rango. Por ejemplo, Digamos que tu dices que el Monstruo de los Lagos puede arrojarte una recompensa entre los $100 y $500 y te gustaría que tuvieran la misma probabilidad de salir cualquier valor en el rango [100, 500]. La función F() para Uniforme adquiere la forma:
X = Valor1 + R * (Valor2 - Valor1)
Siendo Valor1 el menor del rango, y Valor2 el mayor y R el valor aleatorio. Cuando R = 0, X será igual a Valor1 y cuando R = 1, X será igual a Valor2.
Normal
Esta responde a la distribución normal, o función acampanada de Gauss... que dice que el 68% de los datos está a una desviación estandar alrrededor de la media, el 85% a 2, y el 99% a 3desviaciones. Entonces es más probable obtener un valor cercano a un promedio dado y que va decreciendo a medida que se aleja de éste por encima y por debajo. La forma más común de obtener el X es aprovechar el Límite del Valor Central:
1) Generamos una sumatoria de valores aleatorios:
Para i = 1 ... N:
Suma = Suma + R
2) Operamos:
X = (S * Raiz(12/N) * (Suma - N/2)) + U
Siendo S el desvío estándar y U la media.
En algunas implementaciones se suele simplicar las cosas, haciendo N = 12 de modo que:
X = S * (Suma - 6) + U
Como ves, todo se resume a desarrollar una función F (o función inversa) para una distribución dada. El problema es que en ocasiones no es fácil (o hasta no existe) obtener esta función F... Si tu quieres hacerlo muy complejo con tus propias distribuciones muy elaboradas se hace todo un reto.
Si tu buscas que tenga una distribución decreciente piensa en la Exponencial o Weibull (aunque no recuerdo con cuales parámetros es la que se obtiene la forma decreciente y no estoy muy seguro de si podría ser útil). Mucho no recuerdo de Modelos y Simulación.
Puedes diseñar también tus propias distribuciones, y se vale emplear funciones definidas a intervalos como la del ejemplo de Seoane:
X = camisa1 para todo R = 0 ... 0,1
X = camisa2 para todo R = 0,11 ... 0,3
X = camisa3 para todo R = 0,31 ... 1
Puedes mezclar cosas:
X = $$$ según rango [100 * Nivel, 500 * Nivel] para R = 0,01 ... 0,5
X = armadura con Ptos de resistencia según Normal(U = 10 * Nivel, S = 0,75) para R = 0,51 ... 0,99
X = nada para R = 0
De este modo generas previamente un valor aleatorio y en función de eso determinas cual distribución y que cosas regresar. Por ejemplo si obtienes R = 0,66 entonces el Monstruo del Pantano devolverá una marmadura con unos ptos de resistencia según la distribución normal. Aplicas la fórmula que te puse.
O para cuando deba recompensarle con dinero, se aplica la uniforme con rango ajustado al Nivel del jugador.
La imaginación es el límite.
Lo puedes encarar de forma simple aplicando condicionales (ya sea ifs o cases) a como el ejemplo de seoane, o bien como algo más formal, técnico y ni que decir... académico. No se que tan al tanto estás de los conceptos de Distribuciones de probabilidad y funciones de Densidad/Probabilidad y de variables aleatorias.
En resumen, lo que dicen esos conceptos chinescos es que se puede obtener una variable aleatoria dependiendo de una función de distribución de probabilidad dado un valor aleatorio (obtenido por un generador, como Random). Matemáticamente,
X = F(D1 ... Dn, , R);
Siendo X el valor que deseamos obtener, D1 a Dn los datos básicos necesarios para la función F de la distribución de probabilidad D y R el valor aleatorio obtenido en en generador cuyo rango es [0,1)
El problema es que generalmente se explica a las cosas al revés,
R = f(X, D1 ... Dn)
Es decir obtener la probabilidad para el Dato X según la distribución. Tu necesitas su inversa F.
Debes pensar, si lo quieres ver de este modo, que distribución de probabilidad es la más adecuada a esperar para tu caso. Hay diferentes distribuciones: Uniforme, Normal, Exponencial, Student, Weibull por mencionar algunas. Las más habituales son Uniforme, Normal y Exponencial ya que son las que más abundan en la vida cotidiana. El resto de las distribuciones son casos especiales de Normal o de Exponenciales o tienen otros usos.
Uniforme
Esta distribución lo que hace es asignar la misma probabilidad para todos los valores de un rango. Por ejemplo, Digamos que tu dices que el Monstruo de los Lagos puede arrojarte una recompensa entre los $100 y $500 y te gustaría que tuvieran la misma probabilidad de salir cualquier valor en el rango [100, 500]. La función F() para Uniforme adquiere la forma:
X = Valor1 + R * (Valor2 - Valor1)
Siendo Valor1 el menor del rango, y Valor2 el mayor y R el valor aleatorio. Cuando R = 0, X será igual a Valor1 y cuando R = 1, X será igual a Valor2.
Normal
Esta responde a la distribución normal, o función acampanada de Gauss... que dice que el 68% de los datos está a una desviación estandar alrrededor de la media, el 85% a 2, y el 99% a 3desviaciones. Entonces es más probable obtener un valor cercano a un promedio dado y que va decreciendo a medida que se aleja de éste por encima y por debajo. La forma más común de obtener el X es aprovechar el Límite del Valor Central:
1) Generamos una sumatoria de valores aleatorios:
Para i = 1 ... N:
Suma = Suma + R
2) Operamos:
X = (S * Raiz(12/N) * (Suma - N/2)) + U
Siendo S el desvío estándar y U la media.
En algunas implementaciones se suele simplicar las cosas, haciendo N = 12 de modo que:
X = S * (Suma - 6) + U
Como ves, todo se resume a desarrollar una función F (o función inversa) para una distribución dada. El problema es que en ocasiones no es fácil (o hasta no existe) obtener esta función F... Si tu quieres hacerlo muy complejo con tus propias distribuciones muy elaboradas se hace todo un reto.
Si tu buscas que tenga una distribución decreciente piensa en la Exponencial o Weibull (aunque no recuerdo con cuales parámetros es la que se obtiene la forma decreciente y no estoy muy seguro de si podría ser útil). Mucho no recuerdo de Modelos y Simulación.
Puedes diseñar también tus propias distribuciones, y se vale emplear funciones definidas a intervalos como la del ejemplo de Seoane:
X = camisa1 para todo R = 0 ... 0,1
X = camisa2 para todo R = 0,11 ... 0,3
X = camisa3 para todo R = 0,31 ... 1
Puedes mezclar cosas:
X = $$$ según rango [100 * Nivel, 500 * Nivel] para R = 0,01 ... 0,5
X = armadura con Ptos de resistencia según Normal(U = 10 * Nivel, S = 0,75) para R = 0,51 ... 0,99
X = nada para R = 0
De este modo generas previamente un valor aleatorio y en función de eso determinas cual distribución y que cosas regresar. Por ejemplo si obtienes R = 0,66 entonces el Monstruo del Pantano devolverá una marmadura con unos ptos de resistencia según la distribución normal. Aplicas la fórmula que te puse.
O para cuando deba recompensarle con dinero, se aplica la uniforme con rango ajustado al Nivel del jugador.
La imaginación es el límite.

#4
Escrito 01 julio 2012 - 06:11
Muchisimas gracias Delphius...
Unas tremendas Gracias... :3
Unas tremendas Gracias... :3