Então! também acredito que não precisamos reinventar a roda. Não vejo problemas em pesquisar e encontrar e usar uma função pronta.
Porém!!!!
Acredito que não deveríamos nos abstrair da lógica do código encontrado. Especialmente em um código tão pequeno quando esse que foi proposto. Poucas linhas e fáceis de entender... Os instrutores poderiam ter feito uma forcinha e explicado como ele funciona, mesmo que superficialmente.
O algoritmo de Fisher–Yates é a forma clássica de embaralhar um array de forma justa (cada ordem tem a mesma chance de acontecer).
Explicação do que acontece:
- Imagine um baralho de cartas. Você pega uma carta qualquer e troca de lugar com outra aleatória.
- Depois vai para a próxima carta e faz o mesmo, mas agora só escolhe entre as que ainda não foram fixadas.
- No fim, todas mudaram de lugar de maneira aleatória e equilibrada.
No JavaScript:
function embaralhar(array) {
for (let i = array.length - 1; i > 0; i--) {
// escolhe índice aleatório entre 0 e i
const j = Math.floor(Math.random() * (i + 1));
// troca array[i] com array[j]
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
// Exemplo de uso:
let numeros = [1, 2, 3, 4, 5];
console.log(embaralhar(numeros));
Resumo do que acontece linha por linha:
* `for (let i = array.length - 1; i > 0; i--)`: começa do último elemento e vai descendo.
* `Math.random() * (i + 1)`: gera número aleatório entre `0` e `i`.
* `[array[i], array[j]] = [array[j], array[i]];`: troca os dois de lugar.
Esse processo garante que cada elemento pode acabar em qualquer posição com probabilidade igual.