¿Cómo funciona el algoritmo iPod shuffle?

No estoy impresionado con la solución devansh. Puedo pensar en Fisher – Yates shuffle – Wikipedia.

Barajar un conjunto dado

El algoritmo de barajado de Fisher-Yates funciona en O (n) complejidad de tiempo. La suposición aquí es que se nos da un

función rand () que genera un número aleatorio en O (1) tiempo.

La idea es comenzar desde el último elemento, intercambiarlo con un elemento seleccionado al azar del conjunto

matriz (incluido el último). Ahora considere la matriz de 0 a n-2 (tamaño reducido en 1) y repita el proceso

hasta que lleguemos al primer elemento.

+ ———————- +

Verifique que el algoritmo de mezcla de Knuth sea lo más imparcial posible

Cómo probar si una baraja de cartas se ha barajado lo suficiente en Java

Shuffle Fisher-Yates – Wikipedia

Arrastramiento

Barajar una matriz determinada – GeeksforGeeks

https://techblog.bitzino.com/201…

Shuffle Fisher-Yates (Knuth shuffle)

Para barajar una matriz a de n elementos (índices 0..n-1):

  para i de n - 1 abajo a 1 do
 j ← entero aleatorio tal que 0 ≤ j ≤ i
 intercambiar una [j] y una [i]

El shuffle de Fisher-Yates es imparcial, por lo que cada permutación es igualmente probable. La versión moderna del algoritmo también es bastante eficiente, ya que solo requiere un tiempo proporcional al número de elementos que se barajan y no hay espacio de almacenamiento adicional. La barajadura de Fisher-Yates es similar a sacar al azar boletos numerados (combinatoria: objetos distinguibles) de un sombrero sin reemplazo hasta que no quede ninguno.

Ventajas:

(1) el tiempo asintótico y la complejidad espacial son óptimos. O (N) tiempo y O (1) espacio

(2) garantizado para producir resultados imparciales

(3) puede detenerse a la mitad, o incluso detenerse y reiniciarse repetidamente, generando la permutación de forma incremental según sea necesario

(4) es secuencial no paralelo

===============

Otros algoritmos para barajar:

asigna un número aleatorio a cada elemento del conjunto que se barajará y luego ordena (puede usar la clasificación de Radix) el conjunto de acuerdo con los números asignados

(1) aunque la clasificación general es O (n log n), los números se clasifican de manera eficiente utilizando la clasificación Radix en el tiempo O (n)

(2) produce resultados imparciales

(3) tiene una implementación paralela simple

Pero,

(1) debe asegurarse de que los números aleatorios asignados nunca se dupliquen

(2) requiere un espacio asintóticamente mayor: O (n) espacio de almacenamiento adicional para los números aleatorios

===============

fusionar dos secuencias al elegir repetidamente una de ellas con la misma probabilidad (hasta que la elección se ve forzada por el agotamiento de una secuencia) no produce resultados con una distribución uniforme; en cambio, la probabilidad de elegir una secuencia debe ser proporcional al número de elementos que quedan en ella. De hecho, ningún método que utilice solo eventos aleatorios bidireccionales con igual probabilidad (“lanzamiento de monedas”), repetido un número limitado de veces, puede producir permutaciones de una secuencia (de más de dos elementos) con una distribución uniforme, porque cada ejecución la ruta tendrá como probabilidad un número racional con como denominador una potencia de 2, ¡mientras que la probabilidad requerida es 1 / n! para cada permutación posible no es de esa forma.

===============

¿Cómo verificar que un algoritmo aleatorio sea imparcial?

  1. tomar un tamaño de matriz relativamente pequeño, realizar una gran cantidad de barajaduras en él,
  2. cuente cuántas veces observa cada permutación y luego
  3. realice la prueba de Chi-cuadrado de Pearson para determinar si los resultados están distribuidos uniformemente en el espacio de permutación.
  // imagina una baraja de cartas.  El superior está numerado N-1.  El de abajo es
 // numerado 1. Seleccionamos al azar una carta del mazo (incluida la parte superior),
 // luego intercambia con el superior, luego, quita el superior.
 shuffle nulo (vector  & a) {
  int N = a.size ();
  para (int i = N-1; i> 0; --i) {// esencia, nota, i> 0 no i> = 0
  int r = rand ()% (i + 1);  // esencia, nota, i + 1 no i.  "rand ()% (i + 1)" significa 
  // genera números de rand de 0 a i
  swap (a [i], a [r]);
  } 
 }
 // la implementación en C ++ STL
 plantilla 
  void random_shuffle (RandomAccessIterator primero, RandomAccessIterator último,
  RandomNumberGenerator y gen)
 {
  iterator_traits  :: diferencia_tipo i, n;
  n = (último-primero);
  para (i = n-1; i> 0; --i) {
  swap (primero [i], primero [gen (i + 1)]);
  }
 }

Bueno, no estoy seguro de si el algoritmo de barajado funciona de esta manera, pero esta es una pregunta de entrevista bastante popular (escriba la función de barajar para una lista de reproducción de iPod) y una de las respuestas suele ser así:
Supongamos que hay N canciones en la lista de reproducción
Por primera vez, el usuario golpea aleatoriamente en una lista de reproducción
Elija la primera canción y cámbiela al azar con una canción entre las posiciones 1 y N. Luego escoja la segunda canción de la lista y cámbiela al azar con una canción entre las posiciones 2 y N. Sigue haciendo esto hasta N – 1. Tienes una lista de reproducción “barajada” lista.

More Interesting

¿Cuál es el mejor curso de análisis de datos y algoritmos presentado con el lenguaje Python?

¿Cómo se puede mejorar la velocidad de los algoritmos de reconocimiento facial?

¿Cómo afectan los nuevos algoritmos de Instagram a la búsqueda de hashtag?

En un montón binario, un nodo con índice i tiene hijos en los índices 2i + 1 y 2i + 2 (cuando la matriz es 0 indexada). ¿Cómo se deriva esta relación?

Si todos los códigos de computadora son 0s y 1s, ¿cómo reconoce y entiende la computadora estos símbolos en primer lugar?

¿Cómo se explicaría a un lego el modelo computacional del juego de FIFA?

¿Cuál es la probabilidad de que un determinado número binario de 6 bits divida perfectamente un binario aleatorio de 15 bits?

¿De qué manera aprender sobre algoritmos mejora sus habilidades de programación?

¿Cuál es la optimización de un conjunto de antenas?

¿Cuál es la diferencia entre la mochila y los problemas de Cutting the Rod usando programación dinámica?

¿Existe alguna fórmula o algoritmo que determine / calcule los precios del gas o del petróleo?

Cómo utilizar el algoritmo Hidden Markov Model Viterbi para el etiquetado de secuencias

¿Diferencia entre algoritmo de relleno de inundación y relleno de límite en gráficos de computadora?

¿Cuál es la estructura de algoritmo / datos utilizada por Lucene para calcular el término frecuencia de los documentos?

¿Cuál es la relación entre el análisis probabilístico y el algoritmo aleatorio?