Foros del Web » Programando para Internet » PHP »

Calcular aleatoriedad pero controlada

Estas en el tema de Calcular aleatoriedad pero controlada en el foro de PHP en Foros del Web. Hola, bueno, mirad, tengo la siguiente cuestion: - Tengo cuatro variables, con un numero del 0 a 100: Código PHP: $variable1 =  20 ; $variable2 ...
  #1 (permalink)  
Antiguo 20/07/2008, 07:26
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Pregunta Calcular aleatoriedad pero controlada

Hola, bueno, mirad, tengo la siguiente cuestion:
- Tengo cuatro variables, con un numero del 0 a 100:
Código PHP:
$variable120;
$variable280;
$variable330;
$variable450
Pues me gustaria saber como sacar una de estas variables aleatoriamente pero, que tenga mas posibilidades la que mas valor tenga. Por ejemplo, aleatoriamente la "variable2" saldria mas veces que la "variable4" y esta a su vez que la "variable3" y asi.
¿Como lo hago?

Gracias.
  #2 (permalink)  
Antiguo 20/07/2008, 13:16
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 18 años, 11 meses
Puntos: 6
Respuesta: Calcular aleatoriedad pero controlada

Cómo yo lo veo: esto sería como extraer un valor de una lista "ponderada", de una manera similar a como se sacan los banners en un sistema de publicidad. A mayor peso, más probabilidades de salir.

Yo lo haría así:

- Crear un array con los valores, en lugar de tenerlos en variables diferentes:
$pesos[] = array(0, 20, 80, 30, 50);

- Crear una lista con los pesos multiplicados por un valor aleatorio:
$valores = array();
foreach ($pesos as $peso) {
$valores[] = $peso * funcion_random(); // no recuerdo la sintaxis de las funciones random
}

- Ordenar de mayor a menor la lista $valores, manteniendo los índices (quizá habría que asignarles un índice tipo 'id' tanto al crear $pesos como al crear $valores).
- La primera posición de la "nueva" lista es la posición buscada.

Creo que me he liado algo con la explicación, pero si te lo miras un poco verás que la idea es bastante sencilla.

Si en vez de tenerlo en PHP lo tuvieras en BD, sería algo como esto:

SELECT id
FROM valores
ORDER BY peso * rand() DESC
LIMIT 0, 1
  #3 (permalink)  
Antiguo 20/07/2008, 13:41
 
Fecha de Ingreso: septiembre-2004
Mensajes: 252
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: Calcular aleatoriedad pero controlada

http://php.net/array_rand
  #4 (permalink)  
Antiguo 20/07/2008, 16:26
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Respuesta: Calcular aleatoriedad pero controlada

Hola Juanfuentes, gracias por leer y entender mi mensaje te estoy muy agradecido.
Lo que me falta por saber es:
Cita:
Ordenar de mayor a menor la lista $valores, manteniendo los índices (quizá habría que asignarles un índice tipo 'id' tanto al crear $pesos como al crear $valores).
Es decir ya tengo un array de 3 posiciones($variable[1],$variable[2],$variable[3]), en cada posicion tengo un valor diferente.
¿Como puedo saber que posicion del array es la que mas valor tiene?

Muchas gracias.
  #5 (permalink)  
Antiguo 20/07/2008, 16:54
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 125
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Calcular aleatoriedad pero controlada

No se si existe una funcion que lo haga directamente pero basicamente seria:



Código PHP:
$maximo=0;
for (
$i=0;$i<4;$i++) {
if (
$valores[$i]>$maximo){
$maximo=$valores[$i];
$id=$i:
}

en $id te queda indice del maximo valor y en $maximo el valor maximo

Saludos
__________________
alquiler gesell
  #6 (permalink)  
Antiguo 20/07/2008, 17:33
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Respuesta: Calcular aleatoriedad pero controlada

Gracias acknowledge,
Casi lo tengo resuelto, ahora me encuentro con otro problema para mi dificil (De calculo),
Digamos que tenemos dos variables que pueden tomar un valor de 1 hasta 255,
¿Como puedo asociarles un porcentaje?
Es decir, la variable con el valor de 255, tendria un 99%
La variable con el valor de 1, tendria un 1%.

Otro ejemplo

Una variable con un valor de 128 tendria un 51%,
Y otra con un valor de 64 tendria un 25%

¿Como podria hacerlo?

Muchas gracias.
  #7 (permalink)  
Antiguo 20/07/2008, 17:52
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 125
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Calcular aleatoriedad pero controlada

No se si entiendo bien la idea.
Se podría hacer como dijo juanfuentes pero con 255 numeros.
o hacer
para el segundo caso por ejemplo:
una random de 1 a 100
si sale entre 1 y 25 asignar que salio el 64
si sale entre 25 y 76 asignar que salio el 128
y asignar los restantes.

En simulacion numerica yo lo conozco con funciones continuas (este caso es discreto)
y es similar solo que al numero aleatorio se le aplica una funcion continua.

Saludos
__________________
alquiler gesell
  #8 (permalink)  
Antiguo 20/07/2008, 18:02
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Respuesta: Calcular aleatoriedad pero controlada

No, no me refiero a eso, me refiero sobre un 100% cual maximo es 255,
Si la variable 1 da la mitad de este numero su porcentaje es 50%
Si la variable da por ejemplo 1, su porcentaje es 1% (en realidad seria algo com 0,1% pero se redondearia)
¿Se me entiende?

Un saludo.
  #9 (permalink)  
Antiguo 20/07/2008, 18:17
 
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina.
Mensajes: 95
Antigüedad: 16 años, 7 meses
Puntos: 2
Respuesta: Calcular aleatoriedad pero controlada

Hola. Te voy a dar una mano mas que nada con el pseudo código. Posiblemente tenga algunos errores de sintaxis o de procedimiento lo que escribo, pero fijate que es correcto desde la lógica, y eso es en lo que quería aportar mas que nada.

La manera en que solucionaría eso que proponés ultimo sería con varios if.

Primero usas cosas de lógica o de probabilidad:

Vamos al caso mas facil:
Cita:
Es decir, la variable con el valor de 255, tendria un 99%
La variable con el valor de 1, tendria un 1%.
Pones una variable auxiliar que pueda tomar valores entre 0 y 99.

y le asignas un valor random entre 0 y 99.

primero declaras:
$variable1 = 1;
$variable2 = 255;

después preguntas:

Cita:
Iniciado por php
if ( $varaux == 0)
$variableasignada = $variable1 ;
else
$variableasignada = $variable2;
Entonces hay un 1% de posibilidades de que la variable que vale 1 salga y un 99% de que salga la de 255.

Ahora vamos al otro caso:
Cita:
Una variable con un valor de 128 tendria un 51%,
Y otra con un valor de 64 tendria un 25%
Ahora es un poco distinto. Además agrego una variable3 que tenga un 24% de posibilidades así los números cierran en 100.

$variable1 = 128 ;
$variable2 = 64 ;
$variable3 = lo que quieras ;

Cita:
Iniciado por php
if ( $varaux <= 50 ) // varaux está entre 0 y 50 inclusive (51%)
$variableasignada = $variable1 ;
else if ( ($varaux >= 50) && ($varaux <= 75) ) // varaux está entre 51 y 75 inclusive (25%)
$variableasignada = $variable2;
else $variableasignada = $variable3 ; /* o acá hacés lo que necesites hacer, no necesariamente asignar una variable3 */

PD: esto es lo que entendí yo por "aleatoreidad controlada". Es decir, vos podés controlar con cuánta probabilidad querés que salga una variable, y eso lo controlás con los if.
Los 2 ejemplos en la manera en que los hice están sujetos a porcentajes enteros, no decimales. En ese caso aproximá.

Ahora, si lo que querés es que vaya variando la probabilidad de que ocurran, ahí podrías introducir otras variables aleatorias, y meterlas adentro de esos if.

Última edición por _Maxi; 20/07/2008 a las 18:24
  #10 (permalink)  
Antiguo 20/07/2008, 18:22
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 125
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Calcular aleatoriedad pero controlada

Queres la acumulacion de probabilidad que se conoce como P (P mayuscula)?

P(n)=n*(1/255) y multiplicala por 100 si lo queres en porcentaje

vale si los 255 numeros tienen la misma probabilidad
__________________
alquiler gesell
  #11 (permalink)  
Antiguo 20/07/2008, 19:53
 
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina.
Mensajes: 95
Antigüedad: 16 años, 7 meses
Puntos: 2
Respuesta: Calcular aleatoriedad pero controlada

Astut, si lo que pides no es lo que yo puse, por favor trata de explicar todo de nuevo. Porque se hace dificil entende qué es lo que necesitas. Saludos.
  #12 (permalink)  
Antiguo 21/07/2008, 06:09
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Respuesta: Calcular aleatoriedad pero controlada

Hola,
acknowledge Gracias por la funcion me ha sevido,
_Maxi con tu codigo me veria limitado ya que podia salir cualquier valor pero gracias.
Ahora queda otra cuestion.
Tengo una variable con un valor de 150 que da 59%
Tengo otra variable con un valor de 2 que da 1%

A partir de esto, ¿Como saco aleatoriamente una de las dos variables siendo la de 59% mucho mas probable?
Hehe es el paso final que queda.

Muchas gracias
  #13 (permalink)  
Antiguo 21/07/2008, 07:07
 
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina.
Mensajes: 95
Antigüedad: 16 años, 7 meses
Puntos: 2
Respuesta: Calcular aleatoriedad pero controlada

Qué es "dar" ?

No entiendo a qué te referís cuando decís:

Cita:
Tengo una variable con un valor de 150 que da 59%
  #14 (permalink)  
Antiguo 21/07/2008, 07:18
 
Fecha de Ingreso: septiembre-2005
Ubicación: Valencia
Mensajes: 738
Antigüedad: 18 años, 7 meses
Puntos: 5
Respuesta: Calcular aleatoriedad pero controlada

Usando la funcion P(n) descrita anteriormente a eso me refiero.
Lo hago por pasos,
Primero tengo dos variables, una con un valor de 150 y otra con un valor de 2.
Les paso la funcion P(n) que resulta, la variable con un valor de 2 da un 1%, y la variable con un valor de 150 da un 59%.
Y ahora quiero lo que he dicho anteriormente.
¿Se entiende?

Muchas gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:43.