Cómo mezclar una lista en C#: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo mezclar una lista en C#: de principiante a usuario seguro

\n\n

Imagina la situación: estás escribiendo un programa para un concurso, y las preguntas deben aparecer en orden aleatorio. O quizás estás haciendo una aplicación para un sorteo de premios, donde cada participante recibe un número aleatorio. O tal vez solo quieres que una lista de reproducción musical se reproduzca en orden aleatorio, y no alfabéticamente. En todos estos casos, te enfrentas a la misma tarea: ¿cómo mezclar una lista (List<T>) en C#?

\n\n

La pregunta es tan popular que en Stack Overflow ha acumulado miles de visitas y cientos de respuestas. Y no es de extrañar: aunque la tarea parece simple, tiene sus trampas. En este artículo, analizaremos las tres formas más populares de aleatorizar una lista en C#, desde la más simple hasta la más eficiente. Aprenderás cómo funciona cada método, cuándo aplicarlo y, lo que es importante, cómo no pisar el rastrillo.

\n\n

¿Por qué no se puede simplemente ordenar aleatoriamente?

\n\n

Lo primero que se le ocurre a un principiante: "Voy a ordenar la lista de forma aleatoria". Se ve más o menos así:

\n\n
List<string> myList = new List<string> { "Manzana", "Plátano", "Cereza", "Melón" };\nRandom rnd = new Random();\nvar shuffled = myList.OrderBy(item => rnd.Next()).ToList();\n
\n\n

El código funciona. Pero solo a primera vista. El problema es que Random.Next() se llama una vez para cada elemento, y la comparación se basa en un solo número aleatorio. Esto no garantiza una distribución uniforme. Es más, este enfoque puede provocar un sesgo (bias): algunos elementos terminarán con más frecuencia al principio o al final de la lista. Para aplicaciones serias (por ejemplo, cálculos científicos o juegos), esto es inaceptable.

\n\n

¡Pero no te apresures a descartar este método! Para tareas simples donde la precisión no es crítica, es perfectamente válido. Solo recuerda sus limitaciones.

\n\n

Método n.º 1: Algoritmo de Fisher-Yates (también conocido como Knuth Shuffle) — el estándar de oro

\n\n

Si quieres hacerlo bien desde el principio, usa el algoritmo de Fisher-Yates. Es un método clásico para mezclar un array o lista, utilizado en programación desde 1938. Funciona en tiempo O(n) y memoria adicional O(1), es decir, muy rápido y eficiente.

\n\n

Así se ve en C#:

\n\n
using System;\nusing System.Collections.Generic;\n\npublic static class ListExtensions\n{\n    private static readonly Random rng = new Random();\n\n    public static void Shuffle<T>(this IList<T> list)\n    {\n        int n = list.Count;\n        while (n > 1)\n        {\n            n--;\n            int k = rng.Next(n + 1);\n            T value = list[k];\n            list[k] = list[n];\n            list[n] = value;\n        }\n    }\n}\n
\n\n

¿Cómo funciona?

\n
    \n
  • Comenzamos con el último elemento de la lista.
  • \n
  • Elegimos un índice aleatorio desde 0 hasta la posición actual.
  • \n
  • Intercambiamos el elemento en la posición actual con el elemento en el índice aleatorio.
  • \n
  • Pasamos al elemento anterior y repetimos hasta llegar al inicio.
  • \n
\n\n

¿Por qué es la mejor opción?

\n
    \n
  • Uniformidad: Cada permutación de elementos es igualmente probable.
  • \n
  • Eficiencia: Una sola pasada por la lista, sin operaciones adicionales.
  • \n
  • Funciona in situ: No crea nuevas listas, ahorrando memoria.
  • \n
  • Versatilidad: Funciona con cualquier tipo IList<T>, incluyendo arrays.
  • \n
\n\n

Su uso es simple:

\n\n
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\nnumbers.Shuffle();\n// Ahora numbers está en orden aleatorio\n
\n\n

Ten en cuenta: declaramos

Blogs

Book Recommendations