Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] 06 Números aleatórios

Fiquei com duas dúvidas sobre o trecho parseInt(Math.random() * 3) + 1; A primeira é: É escrito assim mesmo? O +1 fica fora dos parênteses? Eu achava que ficava assim parseInt(Math.random() * 3) + 1); com o +1 dentro dos parênteses. Eu estava fazendo os testes assim. Só depois que respondi que vi que estava fora dos parênteses.

Segunda dúvida: Eu entendi que o +1 faz o número 3 ser arredondado para para 3. Porque ele é exclusivo e por isso nunca conseguiria ser alcançado sem o +1. O que eu não entendi é o porquê do número zero sumir da contagem. O que faz o número zero ser retirado?

4 respostas
solução!

Olá, Elmo, tudo bem?

A forma correta é parseInt(Math.random() * 3) + 1;

O + 1 fica fora dos parênteses porque você quer somar 1 depois que o número aleatório for multiplicado por 3 e convertido para inteiro. Se estivesse dentro, Math.random() * 3 + 1 seria calculado primeiro, e só então o parseInt() seria aplicado, o que daria uma distribuição diferente dos números.

O + 1 garante que o número 3 seja incluído no resultado, já que Math.random() nunca chega a 1. O zero "some" porque parseInt(Math.random() * 3) resulta em 0, 1 ou 2, e ao somar 1 depois, esses valores se tornam 1, 2 e 3.

Espero ter ajudado.

Mas no código da aula está let numeroSecreto = parseInt(Math.random() * 100 + 1); enquanto na questão do exercício está parseInt(Math.random() * 3) + 1; É diferente. Por isso, fiquei com dúvida. Pode as duas maneiras ou só uma? Ou será que em algum está errado?

Oi Elmo,

A diferença crucial está na ordem das operações.

let numeroSecreto = parseInt(Math.random() * 100 + 1);

Pode gerar números de 1 a 100, mas com uma distribuição ligeiramente enviesada.

let numeroSecreto = parseInt(Math.random() * 100 ) + 1;

Gera números de 1 a 100 com uma distribuição uniforme, que é o que geralmente se deseja em um sorteio ou geração de números aleatórios.

Qual usar?

Sempre use parseInt(Math.random() 100 ) + 1 quando você quiser gerar um número inteiro aleatório entre 1 e 100 (inclusive).

Exemplo prático para demonstrar a diferença (conceitual):

Imagine que Math.random() fosse capaz de gerar apenas 3 números: 0, 0.5 e 0.99.

Com parseInt(Math.random() * 100 + 1):

  • 0 * 100 + 1 = 1. parseInt(1) = 1
  • 0.5 * 100 + 1 = 51. parseInt(51) = 51
  • 0.99 * 100 + 1 = 100. parseInt(100) = 100

Com parseInt(Math.random() * 100) + 1:

  • 0 * 100 = 0. parseInt(0) = 0. 0 + 1 = 1
  • 0.5 * 100 = 50. parseInt(50) = 50. 50 + 1 = 51
  • 0.99 * 100 = 99. parseInt(99) = 99. 99 + 1 = 100

A diferença é sutil, mas importante para garantir a aleatoriedade correta. A segunda versão, parseInt(Math.random() * 100) + 1, é a forma padrão e recomendada.

Espero ter esclarecido sua dúvida!

Entendi sim. Muito obrigado. Já tinha entendido antes, mas agora entendi mais ainda. Então, quer dizer que no video está errado? Porque lá eles usam a versão parseInt(Math.random() * 100 + 1);