Ver Mensaje Individual
  #25 (permalink)  
Antiguo 26/11/2013, 03:32
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

Cita:
Iniciado por marlanga Ver Mensaje
Bueno, pónmelo mas fácil. Imagina que quieres 10 números sin repetir entre 1 y 10.000.000.
¿Cuál algoritmo escogerías? Fuerza bruta. Bien. Ahora la cuestión sólo es ¿a cuánto bajarías el límite para seguir usando fuerza bruta?. Yo dije que alrededor de 1/3. Es decir, para diez valores usaría fuerza bruta para el rango (1-30).

Todo mi texto se basa en esta idea.
Así que 10.000.000 de entradas, si tuvieras que elegir 3.333.333 números (1/3) usarías fuerza bruta....
Ejecuta el benchmark.Para 30 vs 10.Y luego súbelo sólo a 33 entre 100.


No es una cuestión sólo de proporción, sino del número de elementos, ya que, aunque la probabilidad se mantenga, el número de veces que se prueba es mayor, y el tiempo crece.El algoritmo de shuffle es proporcional sólo al número de elementos.El fuerza bruta , no.A medida que el número de elementos crece, shuffle **rápidamente** se hace más eficiente en términos de tiempo de ejecución.

El problema es que elegir usar fuerza bruta es sensible al entorno, así que no puedes cambiar las condiciones de entrada, sin meterte en otro problema distinto.

Aunque tienes razón en que para el caso de 10 elementos entre 10.000.000, es más eficiente tomar 10 elementos al azar, yo no lo veo en el caso inicial, y, sobre todo, en el 99% de los casos prácticos, shuffle es la mejor solución.Hay casos en los que ni shuffle, ni array_rand, ni fuerza bruta son los más **eficientes**.

Intenta ahora elaborar una respuesta intentando basarla en la eficiencia, que sea *exacta*.Cuál es la relación entre número de elementos inicial - número de elementos a tomar - probabilidad de colisión (que no es constante, es un sumatorio)... o simplemente, dices "usa shuffle".