Ver Mensaje Individual
  #22 (permalink)  
Antiguo 25/11/2013, 17:09
Avatar de marlanga
marlanga
 
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Número aleatorio pero evitando uno en particular

Sin array_slice, ¿Qué devuelves?¿Un array de 49 posiciones desordenado? Se debe devolver un array con los números aleatorios, asi pues el array_slice es necesario. Esa operación solo corta el array por el principio. Las funciones shuffle y range son mas costosas.

Y cuando lo ejecuto yo sobre http://sandbox.onlinephpfunctions.com/, me sale:
Código BASH:
Ver original
  1. Con suffle: 4
  2. Fuerza bruta: 3
  3. Mejor: 3
Código PHP:
Ver original
  1. Con suffle: 8
  2. Fuerza bruta: 3
  3. Mejor: 5

Pero no hace falta ni ejecutar, es solo cuestión de pensar qué hace cada algoritmo. El único peligro que tiene el algoritmo de fuerza bruta de resultar costoso, es cuando falla muchas veces al tratar de insertar un número aleatorio en un array que ya lo contiene. Y ese caso ocurre cuando el número de números a obtener es una porción significativa del rango de números posibles. No he hecho pruebas, pero estimo que a partir de 1/3, es posible que la fuerza bruta no sea la mejor opción.

La operación shuffle no es atómica. Su implementación por cojones tiene que recorrer todo el array suministrado, y desordenarlo usando seguramente un FOR.

En cuanto a coste de memoria, tanto el shuffle como el mejorado usan un array de 49 posiciones obtenido con range, y devuelve otro array de 6 posiciones. Si un entero ocupa en php 4 bytes, entonces (49+6)*4=220 bytes.
Sin embargo, el e fuerza bruta sólo hace uso de un array que tendrá 6 posiciones, y una variable. (6+1)*4=28 bytes.

Última edición por marlanga; 25/11/2013 a las 17:26