Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/07/2008, 13:16
juanfuentes
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
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