Hola
A mi tambien me costo entender, incluso a la primera no entendi por que ese codigo era el correcto. Entre de nuevo para darte una respuesta por el tema y aproveche de crear un codigo mas interactivo, le agregue lo que faltaba por lo que puedes probar tu. El html esta sin css asi que es bien "feo". Copia el codigo y pasalo a tu VS Code, desde el html en el vscode presiona alt. +b para que lo abra tu navegador y alli haz las pruebas.
Codigo HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button onclick="sortearLibro('resultado')">Prueba</button>
<p id="resultado"><br></p> <!--su id pasa a la funcion para luego actualizar el p-->
<script src="prueba.js"></script>
</body>
</html>
Codigo JS, recuerda crear el archivo js como prueba.js o renombralo en html:
//Contexto: Imagina que eres una persona desarrolladora que trabaja para Buscante, una importante tienda en línea de libros.
//Tu jefe te ha pedido que crees una función para sortear libros a los clientes. El sorteo debe hacerse de manera que todos los
//libros tengan la oportunidad de ser sorteados al menos una vez, y después de eso, el sorteo debe comenzar de nuevo.
//Recordaste la lección sobre la adición de la variable "numeroLimite" en el curso "Lógica de programación: explore funciones y
//listas". ¿Cómo implementarás el sorteo del libro teniendo en cuenta lo que se enseñó?
//NAeeE = No Aparece en el Ejercicio
function sortearLibro(idParragraph) {
let libroElegido = parseInt(Math.random() * numeroLimite + 1);//se asigna un valor random multiplicandolo por 3 y dandole tipo int
let cantidadDeLibrosSorteados = listaDeLibrosSorteados.length;//asigna a cantidadDeLibrosSorteados el largo de libros sorteados, comenzara en 0
if (cantidadDeLibrosSorteados == numeroLimite) {//si cantidadDeLibrosSorteados alcanza el numero limite
listaDeLibrosSorteados = [];//borrara la lista, en caso contrario continua
elemento=document.getElementById(idParragraph);//toma el id del parragraph del html <p> NAeeE
elemento.innerHTML='Se han alcanzado los 3 sorteos, la lista listaDeLibrosSorteados se deja vacia, su valor es: '+listaDeLibrosSorteados+'<br> como puedes ver, esta vacia. Volver a presionar Prueba reiniciara el sorteo'//le escribe los resultados de las variables NAeeE
}
//Código omitido
else {//else que indica que hacer si aun no se supera el limite. NAeeE
let libroSorteado=listaDeLibros[libroElegido-1];//busca en listaDeLibro con el indice obtenido de Math.random y lo asigna a libroSorteado, a la variable del indice le resta uno para evitar indice 3 que no existe. NAeeE
if (listaDeLibrosSorteados.includes(libroSorteado)){//si el libroSorteado ya esta en listaDeLibrosSorteados hace recursividad. NAeeE
sortearLibro(idParragraph);//recursividad llamando a la misma funcion para hacer un loop. NAeeE
}
else {//si no esta el libroSorteado dentro de listaDeLibrosSorteados. NAeeE
listaDeLibrosSorteados.push(libroSorteado);//lo agrega a esta lista para evitar que vuelva a ser sorteado el mismo. NAeeE
elemento=document.getElementById(idParragraph);//toma el id del parragraph del html <p> NAeeE
elemento.innerHTML='el valor de idParrafraph es: '+idParragraph+'<br>'+//le escribe los resultados de las variables NAeeE
'el resultado de Math.random es: '+libroElegido+'<br>'+'el resultado de listaDeLibros[libroElegido-1] es: '+listaDeLibros[libroElegido-1]+'<br>'+
'el resultado de listaDeLibrosSorteados.length es: '+listaDeLibrosSorteados.length+'<br>'+'la lista listaDeLibrosSorteados contiene: '+listaDeLibrosSorteados
}
}
}
listaDeLibrosSorteados=[];//lista de libros que han sido sorteados. Comienza vacia y se poblara con cada sorteo
listaDeLibros=["Señor de los anillos","Harry Potter PF","Receta cocina"];//lista de libros a sortear. NAeeE
numeroLimite=listaDeLibros.length;//establece el numero limite igual al largo de los libros por sortear, en este caso 3