Opa beleza???
Acredito que identifiquei o erro, está solicitando que sorteie 15 numeros mas o teu range máximo do método sorteia é 10 aí qdo ele encontra do 1 ao 10 não consegue sortear mais e entra em loop. Abaixo eu fiz dois códigos, um seguindo o modelo que implementou com algumas melhorias e o segundo completamente refatorado para que possa usar de referência e aprender um pouco mais.
Bons estudos!!!!
function sorteia() {
return Math.round(Math.random() * 10); //retorna um número aleatório
}
function sorteiaNumeros(quantidade) {
var segredos = [];
var contador = 1;
while(contador <= quantidade) {
var achou = false;
// garantindo que não sorteie o zero
do {
numeroAleatorio = sorteia();
} while (numeroAleatorio == 0);
// entrando na validação quando houver pelo menos 1 segredo adicionado
if (segredos.length) {
for (var posicao = 0; posicao < segredos.length; posicao++) {
if (segredos[posicao] == numeroAleatorio) {
achou = true;
break;
}
}
}
// se não achou o numero, incrementará um novo número aleatório
if (achou == false) {
segredos.push(numeroAleatorio);
contador++;
}
}
return segredos;
}
/**
* o método sorteia tem um limite máximo de 10 números,
* você estava solicitando 15, por isso o looping infinito
* poderá atribuir até no máximo 10
**/
var segredos = sorteiaNumeros(10);
console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);
Refatorado:
function sorteiaRefatorado(intervaloMax = 10) {
// desta forma fica entre 1-10 sem o zero
return Math.round(Math.random() * (intervaloMax - 1)) +1;
}
function sorteiaNumerosRefatorado(quantidade, intervaloMax = 10) {
let segredos = [];
if (quantidade > intervaloMax) {
console.log(`Quantidade não pode ser maior do que ${intervaloMax}`);
return [];
}
while(quantidade) {
numeroAleatorio = sorteiaRefatorado(intervaloMax);
// o includes verifica se existe no array, estou negando a condição com a ! antes ( ou seja, se não estiver na array entra no if)
if (!segredos.includes(numeroAleatorio)) {
segredos.push(numeroAleatorio);
quantidade--; // como não preciso manter a quantidade, posso fazê-la negativa e não preciso criar uma var de contador
}
}
return segredos;
}
// Aqui está usando o default com intervalo de 1-10 e sorteando 10 números
var segredos = sorteiaNumerosRefatorado(10);
console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);
// Usando intervalo de 1-7 e sorteando 7 números
var segredos = sorteiaNumerosRefatorado(7, 7);
console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);
// Usando intervalo de 1-7 e sorteando 8 números, este vai apresentar a mensagem da validação
var segredos = sorteiaNumerosRefatorado(8, 7);
console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);