Olá.
Sim o seu While entrou em loop e encontrei dois motivos.
O primeiro é a variável contador dentro desse if.
if(numero == segredos[posicao]){
contador = contador - 1;
repetiu = true;
break;
}
Não é necessário subtrair do contador quando encontrar um numero repetido, então esse if ficaria assim.
if(numero == segredos[posicao]){
repetiu = true;
break;
}
E o segundo motivo é o if que vai colocar o numero no array segredos.
if(repetiu = false){
segredos.push(numero);
contador++;
}
É necessário 2 iguais( == ) para o operador ser o de comparação, quando colocado apenas 1 igual ( = ) ele é o operador de atribuição, do jeito que está atualmente ele faz a variável repetiu ter o valor false e retorna para o if o valor false, dessa maneira nunca entrando nesse if.
Para funcionar você deve usar o operador de comparação ==
if(repetiu == false){
segredos.push(numero);
contador++;
}
Foi isso que encontrei, espero ter ajudado, qualquer duvida estou a disposição.
Abraços.