Ver Mensaje Individual
  #21 (permalink)  
Antiguo 25/11/2013, 16:08
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Número aleatorio pero evitando uno en particular

Pues no sé qué le pasará entonces a mi implementación de rand()
Código PHP:
Ver original
  1. Con suffle: 14
  2. Fuerza bruta: 26
  3. Mejor: 14
  4.  
  5. Con suffle: 12
  6. Fuerza bruta: 24
  7. Mejor: 10
  8.  
  9. Con suffle: 13
  10. Fuerza bruta: 28
  11. Mejor: 12
  12.  
  13. Con suffle: 13
  14. Fuerza bruta: 23
  15. Mejor: 11
  16.  
  17. Con suffle: 14
  18. Fuerza bruta: 24
  19. Mejor: 11
  20.  
  21. Con suffle: 13
  22. Fuerza bruta: 24
  23. Mejor: 10
  24.  
  25. Con suffle: 13
  26. Fuerza bruta: 24
  27. Mejor: 11
  28.  
  29. Con suffle: 13
  30. Fuerza bruta: 23
  31. Mejor: 11
  32.  
  33. Con suffle: 13
  34. Fuerza bruta: 24
  35. Mejor: 11
  36.  
  37. Con suffle: 13
  38. Fuerza bruta: 23
  39. Mejor: 11

Así que he ido a: http://sandbox.onlinephpfunctions.com/, a ver qué salía:
PHP 5.5.5 : Con suffle: 10 Fuerza bruta: 121 Mejor: 10
PHP 5.5.0 Con suffle: 10 Fuerza bruta: 127 Mejor: 9
PHP 5.4.21 Con suffle: 10 Fuerza bruta: 137 Mejor: 9
PHP 5.4.5: Con suffle: 9 Fuerza bruta: 131 Mejor: 9
PHP 5.3.23 :Con suffle: 9 Fuerza bruta: 135 Mejor: 9

Cita:
Esta filosofía tiene una mejora, y es no hacer un shuffle, si no un array_rand, que saca valores al azar. Así mejoras algo el tiempo de ejecución, pero no el consumo de memoria, que sigue siendo disparatado en comparación al problema a resolver.
Si quieres comparar shuffle con array_rand, no añadas un array_slice.Quita el array_slice (que no es necesario), y vuelve a ejecutar tus tests.

Veamos que dice el sandbox sin el array_slice:

5.5.5: Con suffle: 7 Fuerza bruta: 127 Mejor: 9
5.5.0: Con suffle: 6 Fuerza bruta: 129 Mejor: 10
5.4.1:Con suffle: 7 Fuerza bruta: 130 Mejor: 9
5.3.23:Con suffle: 6 Fuerza bruta: 134 Mejor: 9

Sobre el consumo de memoria "disparatado" en comparación al problema a resolver (aprox. 4*44 bytes): Declara 1 sola estructura de control en PHP (un if, un for, cualquier cosa), y va a consumir más que eso.El algoritmo de fuerza bruta declara un bucle, variables, aparte de arrays de destino, cosa que en shuffle no necestas....Mucho más de 4*44 bytes.No veo lo "disparatado".

PD : resultados de http://writecodeonline.com/php:
Con suffle: 12 Fuerza bruta: 236 Mejor: 17 (sin array_slice)

PD2: Ideone da los resultados que indicas.Para n=8, el tiempo es el mismo en shuffle y rand.La única cosa donde he visto resultados "parecidos" es en codepad.org, pero es demasiado inestable como para ser significativo.

Última edición por dashtrash; 25/11/2013 a las 16:48