Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Numero aleatorio menor que 20 excepto algunos

Estas en el tema de Numero aleatorio menor que 20 excepto algunos en el foro de PHP en Foros del Web. Hola Tengo esta duda. Necesito un algoritmo que me permita obtener un numero aleatorio entre 1 y 20, pero que no esté dentro de valores ...
  #1 (permalink)  
Antiguo 04/06/2014, 10:14
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta Numero aleatorio menor que 20 excepto algunos

Hola

Tengo esta duda. Necesito un algoritmo que me permita obtener un numero aleatorio entre 1 y 20, pero que no esté dentro de valores que consultaré a una base de datos.

Por ejemplo, si un usuario obtiene 5, revisar si en la base de datos no está asignado anteriormente el 5 a alguien, y luego guardar ese valor

Luego el siguiente usuario ingresará y ya no tendrá disponible el 5 porque ya esta asignado.

La idea es que el rango de numero posibles para ese usuario sea de 1 a 20, menos el 5. Luego el siguiente usuario sea de 1 a 20 menos el 5 y el 10, el siguiente de 1 a 20 menos el 5, 10 y 2... y así.

sera posible?
__________________
Aquí voy a escribir mi firma
  #2 (permalink)  
Antiguo 04/06/2014, 10:26
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Numero aleatorio menor que 20 excepto algunos

Me parece mejor traerse los numeros que estan ocupados (si el rango no es grande) que andar haciendo infinitas consultas.

Código SQL:
Ver original
  1. SELECT id FROM tabla WHERE ISNULL(ocupado)
__________________
Salu2!
  #3 (permalink)  
Antiguo 04/06/2014, 12:09
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Numero aleatorio menor que 20 excepto algunos

Hola Italico76, gracias por responder:

Yo creo que traer los valores ya asignados no es el problema. Mi problema es obtener un valor aleatorio, sin considerar esos numeros

Aleatorio { numeros entre (1,20) - Números ya asignados }
__________________
Aquí voy a escribir mi firma
  #4 (permalink)  
Antiguo 04/06/2014, 12:30
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: Numero aleatorio menor que 20 excepto algunos

hola sebandrescc2, al momento de asignar a la perdona el número ¿Puedes ya tener a la mano los que han sido asignados? o ¿De donde sacas esos numeros del 1 al 20? son fijos o tambien vienen de una BD?

A mi lo que se me ocurre es que ya pudieras tener los asignados antes en un array y el conglomerado posble en otro algo asi:

Código PHP:
Ver original
  1. $numerosAsignados = array(1,5,10);
  2. $numeros = array(1,2,3,4,5,6,7,8,9,10,11,12,13.....20);
  3.  
  4. //Aqui obtienes los valores que no están en el arreglo de numeros asignados
  5.  
  6. $result = array_diff($numerosAsignados,$numeros)
  7. //Luego obtienes una posición aleatoria del arreglo resultante.
  8. $numeroQueAsignas = array_rand($result,1);


Creo que esa es la lógica que necesitas, no? en caso contrario comenta a ver si hubo algo que no entendiera. No estoy seguro de la sintaxis exactas de las funcions array_rand y diff pues lo corro en frio, pero supongo que basta con que pruebes o termines d documentarte en la página de PHP
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #5 (permalink)  
Antiguo 04/06/2014, 12:42
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Numero aleatorio menor que 20 excepto algunos

Código PHP:
Ver original
  1. // con generadores desde PHP 5.5
  2. for ($i=1;$i<21;$i++)
  3.     $todos[] = $i;
  4.  
  5. // de tu consulta SQL
  6. $asignados = [4,6,12,17,18,2,19,10];
  7.  
  8. if (count($asignados)==20)
  9.     echo "Todos asingados!";
  10.    
  11. else{
  12.     $libres = array_diff($todos,$asignados);
  13.     shuffle($libres); // mezclo
  14.  
  15.     echo $libres[0];
  16. }
__________________
Salu2!
  #6 (permalink)  
Antiguo 04/06/2014, 12:46
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: Numero aleatorio menor que 20 excepto algunos

Cita:
Iniciado por Italico76 Ver Mensaje
Código PHP:
Ver original
  1. // con generadores desde PHP 5.5
  2. for ($i=1;$i<21;$i++)
  3.     $todos[] = $i;
  4.  
  5. // de tu consulta SQL
  6. $asignados = [4,6,12,17,18,2,19,10];
  7.  
  8. if (count($asignados)==20)
  9.     echo "Todos asingados!";
  10.    
  11. else{
  12.     $libres = array_diff($todos,$asignados);
  13.     shuffle($libres); // mezclo
  14.  
  15.     echo $libres[0];
  16. }
Creo que es más o menos lo que yo coloque.... yo no puse un ciclo para llenar el arreglo de 1 al 20 pues no se si esos valores tambien los tiene en base de datos, simplemente quise mostrarlos de forma explicita. Tambien creo que el rand es más efectivo para que sea un "valor aleatorio" según lo que el dijo, si accede a la posición 0 del array $diff siempre le traera el primer registro que "no se consiga" como asignado, lo cual no lo veo del todo "aleatorio"


Saludos.
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #7 (permalink)  
Antiguo 04/06/2014, 12:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Numero aleatorio menor que 20 excepto algunos

@rjulio21 : cierto..... llegue con mucho calor de la calle... quise hacer eso mismo y la compliqué porque es mas eficiente solo cojer una key que revolver todo el array

"array_diff() siempre le traera el primer registro que "no se consiga" como asignado, lo cual no lo veo del todo "aleatorio""

<< le falto ver el shuffle()


Cita:
$numerosAsignados = array(1,5,10);
$numeros = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 ,19,20);

//Aqui obtienes los valores que no están en el arreglo de numeros asignados

$result = array_diff($numeros,$numerosAsignados);

//Luego obtienes una posición aleatoria del arreglo resultante.
$numeroQueAsignas = $result[array_rand($result)];
__________________
Salu2!
  #8 (permalink)  
Antiguo 04/06/2014, 13:24
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Numero aleatorio menor que 20 excepto algunos

Ahora que lo pienso... hay un algoritmo que resuelve esto..... tocaria hacer interpolacion entre valores asignados para ahorramos generar el conjunto de todos los numeros en el rango lo cual seria una perdedera de tiempo si fueran un rango enorme.

Alog como cojer (max-min)/2 entre los asignados
__________________
Salu2!
  #9 (permalink)  
Antiguo 04/06/2014, 14:33
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Numero aleatorio menor que 20 excepto algunos

Hola, gracias por sus respuestas

Los numeros del 1 al 20 son el rango donde obtengo el numero aleatorio. Al obtenerlo, lo guardo y asigno en una base de datos al usuario.

La clave fue la función array_diff, no la recordaba. Lo demas es un arreglo que puedo realizar

Estoy muy agradecido de ambos.
__________________
Aquí voy a escribir mi firma

Etiquetas: numero
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 13:48.