Se o intervalo de números a sortear for menor qua a quantidade escolhida, a função irá sortear uma quantidade mínima e salvar no array, mas irá acontecer repetição de número nos cálculos pois o mesmo número será sorteado várias vezes.
Ex: Math.floor(Math.random() * (max - min) + min)
((0,1)*(16 - 15 ) + 15) = 16 O intervalo escolhido só permite o sorteio de um número e ele sempre vai estar contido no array, daí o loop infinito.
PARA CORRIGIR O LOOP
if (de >= ate) {
alert("O valor inicial (Do número) não pode ser menor que o final (até o número).Favor corrigir.")
return
} else if ( (ate - de < quantidade)) {
alert(`Erro! O intervalo de números escolhidos não permite sortear ${quantidade} números`)
return
}