Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/02/2015, 13:43
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Combinaciones de números aleatorios que no se repitan

Buenas tardes gente, tengo un problema que en un principio lo subestime como algo trivial pero al cual no le encuentro una solución aceptable.

Un cliente quiere hacer una especie de bingo electrónico, para lo cual, cada jugador tiene vinculados 15 números del 0 al 99 que debe generar el sistema de forma automática.

Las 3 reglas básicas son:

- No puede haber mas de 2 números repetidos en el mismo cartón.
- No puede haber cartones repetidos.
- El orden no importa.

Los puntos 1 y 3 no son difíciles, pero el punto 2 no se como resolverlo.
Pensé en tener 2 tablas en la base de datos:

-- Clientes --
Codigo Integer Autoincrement PK
Nombre CHAR
...

-- Cartones --
Codigo Integer Autoincrement PK
Cliente Integer FK(Clientes.Codigo)
Numero_1 Integer
Numero_2 Integer
Numero_3 Integer
Numero_4 Integer
Numero_5 Integer
Numero_6 Integer
Numero_7 Integer
Numero_8 Integer
Numero_9 Integer
Numero_10 Integer
Numero_11 Integer
Numero_12 Integer
Numero_13 Integer
Numero_14 Integer
Numero_15 Integer

Solución 1:
El algoritmo en php generaría 15 números al azar, los ordenaría y los guardaría en la tabla cartones.
Para saber si no esta esa combinación, esta acción estaría dentro de un while.
El problema de esto es claro: Cuando tenga mas de la mitad de las combinaciones insertadas, agregar un nuevo cartón al azar tardaría un montón y consumiría un montón de recursos y podría tardar mucho tiempo.

Solución 2:
Pre-Poblar la tabla cartones con todas las combinaciones posibles (Un montooooon) y luego seleccionar un cartón al azar de esa tabla que no este asignado para cada cliente nuevo.
Problema: La tabla Cartones es enorme, aun con pocos clientes.

¿Se les ocurre alguna otra solución posible?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 27/02/2015 a las 13:43 Razón: Colores