2
respostas

Dúvidas sobre o parseInt(Math.random() *3 +1);

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.
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
2 respostas

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 geradoResultado 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, 3

Assim, 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.