Como embaralhar uma lista em C#: guia completo para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como embaralhar uma lista em C#: do iniciante ao usuário confiante

\n\n

Imagine a situação: você está escrevendo um programa para um quiz, e as perguntas devem aparecer em ordem aleatória. Ou, talvez, você esteja criando um aplicativo para sorteio de prêmios, onde cada participante recebe um número aleatório. Ou, simplesmente, quer que uma playlist de música toque em ordem aleatória, e não em ordem alfabética. Em todos esses casos, você enfrenta a mesma tarefa: como embaralhar uma lista (List<T>) em C#?

\n\n

A pergunta é tão popular que no Stack Overflow ela acumulou milhares de visualizações e centenas de respostas. E não é surpresa — embora a tarefa pareça simples, ela tem suas armadilhas. Neste artigo, vamos analisar os três métodos mais populares de randomização de listas em C#, do mais simples ao mais eficiente. Você aprenderá como cada método funciona, quando aplicá-lo e, o mais importante, como não pisar na bola.

\n\n

Por que não posso simplesmente ordenar aleatoriamente?

\n\n

A primeira coisa que vem à mente de um iniciante: "E se eu ordenar a lista de forma aleatória?" Parece algo assim:

\n\n
List<string> myList = new List<string> { "Maçã", "Banana", "Cereja", "Melão" };\nRandom rnd = new Random();\nvar shuffled = myList.OrderBy(item => rnd.Next()).ToList();\n
\n\n

O código funciona. Mas apenas à primeira vista. O problema é que Random.Next() é chamado uma vez para cada elemento, e a comparação é feita com base em um único número aleatório. Isso não garante uma distribuição uniforme. Além disso, essa abordagem pode levar a um viés (bias) — alguns elementos podem aparecer com mais frequência no início ou no final da lista. Para aplicações sérias (como cálculos científicos ou jogos), isso é inaceitável.

\n\n

Mas não se apresse em descartar este método! Para tarefas simples, onde a precisão não é crítica, ele pode ser suficiente. O importante é lembrar de suas limitações.

\n\n

Método nº1: Algoritmo de Fisher-Yates (também conhecido como Knuth Shuffle) — o padrão ouro

\n\n

Se você quer fazer tudo certo desde o início, use o algoritmo de Fisher-Yates. Este é o método clássico de embaralhamento de arrays ou listas, usado em programação desde 1938. Ele funciona em tempo O(n) e com memória adicional O(1) — ou seja, é muito rápido e eficiente.

\n\n

Veja como ele fica em 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

Como funciona?

\n
    \n
  • Começamos pelo último elemento da lista.
  • \n
  • Escolhemos um índice aleatório de 0 até a posição atual.
  • \n
  • Trocamos o elemento na posição atual com o elemento no índice aleatório.
  • \n
  • Passamos para o elemento anterior e repetimos até chegar ao início.
  • \n
\n\n

Por que é a melhor escolha?

\n
    \n
  • Uniformidade: Cada permutação dos elementos é igualmente provável.
  • \n
  • Eficiência: Uma única passagem pela lista, sem operações desnecessárias.
  • \n
  • Funciona in-loco: Não cria novas listas, economizando memória.
  • \n
  • Versatilidade: Funciona com qualquer tipo IList<T>, incluindo arrays.
  • \n
\n\n

O uso é simples:

\n\n
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\nnumbers.Shuffle();\n// Agora numbers está em ordem aleatória\n
\n\n

Observe: declaramos

Blogs

Book Recommendations