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

Una versión mejorada de ese algoritmo se puede lograr cambiando esta linea:
Código PHP:
Ver original
  1. mt_srand(123456789);
por esta:
Código PHP:
Ver original
  1. mt_srand($posicion_buscada);
y eliminando el sort del final.

Sera necesario ademas, guardar la combinación generada en la base de datos y el proceso de alta de clientes debera constar de los siguientes pasos:

1) Se da de alta un cliente con ID autoincremental.
2) Se calcula el cartón de ese cliente y se verifica que no este asignado a otro cliente previo.
3) Si no esta asignado, se guardan los datos del cartón asignándoselo al cliente.
4) Si ya esta guardado, se borra de la base de datos el cliente y se da nuevamente de alta (para que tenga un nuevo id) y se vuelve al paso 2.
5) En las lecturas se toman los datos del cartón directamente desde la base de datos.

Ventajas de esta versión mejorada:
- Mayor aleatoriedad, cartones contiguos son mas diferentes entre si.
- Menor consumo y mas velocidad, solo se calcula el carton al momento del alta.

- Contras de la versión mejorada:
- Requiere mas espacio en la base de datos.
- Posibilidad infima pero existente de que queden huecos en los id de los clientes.

Es posible, aunque extremadamente improbable, que la combinación de una semilla (que es la posición buscada) y la combinación a obtener de esa posición, coincidan con otra posición y otra combinación, por tal motivo, se debe preveer este caso con el paso 4.
Es algo muy poco probable pero que quizás alguna vez ocurra.

La versión del mensaje anterior no tiene fallas posibles y es 100% confiable, esta versión mejorada en cambio, tiene un caso particular que hay que considerar, pero las ventajas de usarla lo compensan con creces.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios