Boa tarde,
Fui testar o comando parseInt(Math.random() *3 + 1); e acabou dando este bug. Saberiam me dizer o porquê? Agradeço o apoio.
Boa tarde,
Fui testar o comando parseInt(Math.random() *3 + 1); e acabou dando este bug. Saberiam me dizer o porquê? Agradeço o apoio.
Olá Douglas.
Tudo bem.
Seu código tem um pequeno erro no fechamento dos parenteses.
O correto:
let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1;
Teste ai e avise o resultado.
Explicação mais tecnica.
Você usou este comando para gerar um número aleatório entre 1 e 3:
parseInt(Math.random() * 3 + 1)
À primeira vista, parece certo, mas na verdade há um detalhe sutil:Math.random() retorna um número entre 0 (inclusive) e 1 (exclusivo), ou seja:
0 <= Math.random() < 1
Então:
Math.random() * 3 → valores de 0 até 2.999...
Math.random() * 3 + 1 → valores de 1 até 3.999...
Quando você usa parseInt(), ele não arredonda, ele apenas trunca (remove as casas decimais).
Assim:
| Valor gerado | Resultado de parseInt() |
|---|---|
| 1.0 – 1.999… | 1 |
| 2.0 – 2.999… | 2 |
| 3.0 – 3.999… | 3 |
Até aí parece tudo bem, mas dependendo de como você compara o número secreto no seu código, pode surgir o bug que você viu.
Por exemplo, se o número aleatório gerado raramente for igual ao “número secreto”, o loop pode demorar milhares de tentativas até coincidir (especialmente se houver erro de comparação de tipos ou range errado).
O mais seguro e comum para gerar um número inteiro de 1 a 3 é:
Math.floor(Math.random() * 3) + 1
Explicação:
Math.random() * 3 → valores de 0 até 2.999…Math.floor() → arredonda para baixo (0, 1, 2)+ 1 → ajusta o intervalo para 1, 2, 3Assim, cada número tem probabilidade igual de sair.
O parseInt() não foi feito para esse uso.
Ele converte strings e trunca números, o que pode causar resultados inesperados e loops longos como o seu (as 3353 tentativas!).
Comente ai qualquer duvida.
Bons estudos.