Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Uso do metodo .sort() para embaralhar arrays

pessoal, me surgiu uma duvida aqui vendo as aulas de logica de programação.

na aula, pedem pra vc embaralhar uma lista de nomes pro exercicio, mas ai que vem a duvida, no JS tem um metodo .sort(). pra embaralhar a lista basta pegar let lista = [1,2,3,4] e lista.sort() e foi, mas no video eles procuram uma solução e essa solução é

function embaralhar(lista) {
     for (let indice = lista.length; indice; indice--) {
        const indiceAleatorio = Math.floor(Math.random() * indice);
        [lista[indice - 1], lista[indiceAleatorio]] = [lista[indiceAleatorio], lista[indice - 1]];
    }
}

O metodo .sort() não é usado aqui mais pra exemplificar a procura de soluções na web?

2 respostas
solução!

Oi Eduardo,

Sua dúvida é muito pertinente! O método .sort() em JavaScript, quando usado sem uma função de comparação personalizada, na verdade não garante um embaralhamento aleatório. Ele converte os elementos em strings e os ordena de acordo com a ordem dos pontos de código Unicode, o que pode gerar resultados inesperados e não aleatórios, especialmente com números.

A função embaralhar que você viu na aula implementa o algoritmo de Fisher-Yates (ou Knuth Shuffle), que é um método consagrado para embaralhar arrays de forma aleatória e uniforme. Ele garante que todas as permutações possíveis tenham a mesma probabilidade de ocorrer, o que é fundamental para muitos casos de uso, como sorteios, jogos e testes aleatórios.

Usar o .sort() sem função de comparação para "embaralhar" é um atalho que pode funcionar em casos simples e com arrays pequenos, mas não é a forma correta e confiável de se fazer isso. A função embaralhar mostrada no vídeo é uma solução mais robusta e didática, que ilustra como implementar um algoritmo de embaralhamento.

Para exemplificar, veja a diferença:

let listaNumeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Tentativa de "embaralhar" com .sort() (não funciona corretamente)
listaNumeros.sort();
console.log("Usando sort() sem função de comparação:", listaNumeros); // Resultado não aleatório

// Embaralhamento correto com a função Fisher-Yates
function embaralhar(lista) {
  for (let indice = lista.length; indice; indice--) {
    const indiceAleatorio = Math.floor(Math.random() * indice);
    [lista[indice - 1], lista[indiceAleatorio]] = [lista[indiceAleatorio], lista[indice - 1]];
  }
}

let listaNumeros2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
embaralhar(listaNumeros2);
console.log("Usando o método embaralhar() correto:", listaNumeros2); // Resultado aleatório

O método .sort() sem função de comparação não foi usado no vídeo para exemplificar a procura de soluções na web, mas sim para mostrar que existe uma forma mais correta de embaralhar listas.

tux matrix    Caso este post o tenha ajudado, por favor, marcar como solucionado ☑️. Bons Estudos! 🤓

Interessante, não tinha ideia disso, vou refazer o meu codigo implementando o algoritmo de aleatorização citado no video. Obrigado!