Estoy tratando de elegir un elemento aleatorio de una matriz sin elegir el mismo elemento dos veces.
Después de algunas iteraciones, no está definido.
Funciona con return(pick_random_letter()) . ¿Pero por qué?
¿Por qué pick_random_letter() no retrocede y regresa más tarde?
let letters = [ { name: 'A' }, { name: 'B' }, { name: 'C' }, { name: 'D' }, ] let used_letters = []; function pick_random_letter(){ let random = Math.floor(Math.random() * letters.length); let next_letter = letters[random].name; if (used_letters.includes(next_letter)){ if (used_letters.length == letters.length) used_letters = []; pick_random_letter(); // return(pick_random_letter()) works }else{ used_letters.push(next_letter); return next_letter; } } for (let i = 0; i < 4; i++){ let random_letter = pick_random_letter(); console.log(random_letter); console.log(used_letters); }Ejemplo de trabajo:
let letters = [ { name: 'A' }, { name: 'B' }, { name: 'C' }, { name: 'D' }, ] let used_letters = []; function pick_random_letter(){ let random = Math.floor(Math.random() * letters.length); let next_letter = letters[random].name; if (used_letters.includes(next_letter)){ if (used_letters.length == letters.length) used_letters = []; return(pick_random_letter()); }else{ used_letters.push(next_letter); return next_letter; } } for (let i = 0; i < 4; i++){ let random_letter = pick_random_letter(); console.log(random_letter); console.log(used_letters); }Gracias
Creo que sería mejor usar un enfoque de barajado. Cree una lista mezclada de sus letras y elija entre ellas. Esto evita tener que comprobar si hemos devuelto una carta con anterioridad.
Comenzaríamos creando una matriz de letras barajadas, luego, cada vez que llamamos a pick_random_letter(), devolvemos el siguiente valor.
La función de shuffle() aquí es una reproducción aleatoria básica de Fisher-Yates / Knuth .
function shuffle(arr) { for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; } let letters = [ { name: 'A' }, { name: 'B' }, { name: 'C' }, { name: 'D' }, ] // Create a shuffled copy of the letters array let shuffledLetters = shuffle([...letters]); function pick_random_letter() { return shuffledLetters.pop(); } for (let i = 0; i < letters.length; i++) { let random_letter = pick_random_letter(); console.log(random_letter); } .as-console-wrapper { max-height: 100% !important; }