Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

10
respostas

quem mais viu o erro no código da resposta correta escrevendo assim ele nao vai gerar um código entre 1 e 3 e sim entre 2 e 3

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

10 respostas

Olá, Joel!

A função Math.random() gera um número decimal aleatório entre 0 (inclusivo) e 1 (exclusivo). Quando queremos transformar esse número em um inteiro dentro de um intervalo, como de 1 a 3, precisamos ajustar a escala e arredondar o valor.

Para isso, é correto fazer o que a alternativa A diz:

"...usar o código: let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1;."

Nesse caso, Math.random() * 3 vai gerar um número decimal entre 0 e 2.999..., e a função parseInt() vai arredondar esse número para baixo, resultando em um inteiro de 0 a 2. Adicionando 1, ajustamos o intervalo para ser de 1 a 3.

Para confirmarmos isso, podemos verificar as possibilidades de retorno desse código:

  • 1. Se Math.random() retorna o menor valor possível, que é 0, será feito 0 * 3, que é 0. Somando 1, ao fim obtemos 1 (valor mínimo).

  • 2. Se Math.random() retorna o maior valor possível, que é um valor próximo de 1 (mas nunca 1), digamos 0.999..., será feito 0.999... * 3, que é aproximadamente 2.999.... A função parseInt(2.999...) arredondará esse valor para baixo, nos dando o valor 2. Somando 1, ao fim obtemos 3 (valor máximo).

Espero ter ajudado a esclarecer sua dúvida. Fico à disposição para ajudar caso tenha mais questões futuramente!

Até mais.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

não amigo você nao entendeu. não fiquei com nenhuma dúvida pois a função let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1; se você colocar o 1 fora do parentese o código vai gerar numeros aleatórios apartir do numero 2, nunca vai ser gerado o 1; mais se você colorar o código parseInt(Math.random() * 3 + 1), vai obter numeros aleatórios de 1 a 3. o erro está ai. pode testar!.

Olá, Joel!

Se entendi bem, você está dizendo que a função com o número "+ 1" fora dos parênteses não funciona corretamente, somente gerando números aleatórios entre 2 e 3, enquanto a função com "+ 1 dentro dos parênteses funciona corretamente, gerando números aleatórios entre 1 e 3. É isso?

A sua função está correta. No entanto, a do exercício também resulta em números aleatórios entre 1 e 3.

Vamos entender os dois códigos:

Código da alternativa:

let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1;
  • Math.random() * 3: Pega um número entre 0 e 2.999....
  • parseInt(...): Remove as casas decimais, ficando apenas com 0, 1 ou 2.
  • + 1: Adiciona 1 ao resultado final, que pode ser 1, 2 ou 3.
  • Resultado Final: Números aleatórios entre 1 e 3.

Sua sugestão:

let numeroAleatorio1a3 = parseInt(Math.random() * 3 + 1);
  • Math.random() * 3 + 1: Pega um número entre 1 e 3.999....
  • parseInt(...): Remove as casas decimais, ficando apenas com 1, 2 ou 3.
  • Resultado Final: Números aleatórios entre 1 e 3.

Espero ter ajudado! Fique à vontade para continuar utilizando o Fórum sempre que precisar.

Até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

OPA!. É ai que eu quero chegar, o primeiro código gera numeros de 0 a 3 e a questão pede numero de 1 a 3. então ele está certo por um lado mais errado por o outro na resposta

Fala, Joel!

No primeiro código, Math.random() * 3 pode gerar os valores 0, 1 ou 2. Após isso, é somado 1 ao valor resultante. Tendo isso, veja no que o código pode resultar:

  • (Math.random() * 3) = 0: Somando 1, o resultado é 1;

  • (Math.random() * 3) = 1: Somando 1, o resultado é 2;

  • (Math.random() * 3) = 2: Somando 1, o resultado é 3;

Ou seja, os resultados (após ser somado 1) podem ser 1, 2 ou 3.

Caso esse código realmente não esteja correto na sua visão, acredito que eu não esteja entendendo bem o seu ponto.

Lembre-se que o Fórum permanece sempre aberto às suas questões!

Abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Nícolas, A questão então pelo oq vc explicou, independente de onde esteja o )

  1. let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1; ou
  2. let numeroAleatorio1a3 = parseInt(Math.random() * 3 + 1); Resulta o mesmo? A questão que deve está criando dúvidas é a posição do ) podendo interferir ou não, no resultado, entendeu? Obrigada

isso mesmo Patrícia, ótimo posicionamento. fiz uns testes e vi que o posicionamento do numero um dentro ou fora dos parênteses podem interferir no resultado contando apenas do 2 ao numero definido após o sinal de *, por exemplo: "parseInt(Math.random() * 4) + 1". Contando apenas; 2,3,4. E parseInt(Math.random() * 4+1) ". contando 1,2,3,4.

essa é a questão que estou tentando explicar ao Nícolas e ele nao compreendeu. Abraços a todos que interagiram com o pos.

Eu percebi também assim que finalizou a aula, achei estranho e respondi errado a questão pois não foi falado no vídeo que também poderia ser nesse modelo let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1;

Olá, pessoal! Tudo certo?

Que demais ver a interação de vocês! Fiquem sempre a vontade para expor suas dúvidas e posicionamentos!

Em relação a questão central do post, eu havia entendido que a dúvida é em relação a posição do parênteses de fechamento (")") mesmo. Como expliquei, não faz diferença, no caso do exercício que estamos o parênteses estar antes ou depois do "+ 1".

Como expliquei na minha segunda resposta, o que ocorre para cada fórmula é o seguinte:


Código da alternativa:

let numeroAleatorio1a3 = parseInt(Math.random() * 3) + 1;

*Com "+ 1" fora dos parênteses.

  • 1. É gerado um número aleatório entre 0 e 2,999... (com "Math.random() * 3"): Notem que aqui temos um número que está entre 0 e 2,999..., não um número entre 1 e 3, ou seja, não atingimos o objetivo da questão ainda.

  • 2. O número gerado é arredondado para baixo (com "parseInt(...)") Agora, removemos as casas decimais do número gerado (que pode ir de 0 até 2,999... por enquanto). Por exemplo, se for gerado o número 0,452..., teremos 0 como resultado, se for gerado o número 1,000293, teremos 1 como resultado e se for gerado, por exemplo, o número 2,81202... o resultado que teremos será 2. Com isso, os únicos resultados possíveis para esse código até agora são 0, 1 ou 2 (ainda não atingimos o objetivo).

  • 3. Adicionamos 1 ao resultado (com "+1"): No passo anterior, vimos que podemos ter 0, 1 ou 2 como resultado do código. Agora, iremos adicionar um ao resultado gerado, independente de ser 0, 1 ou 2, será adicionado 1 ao resultado. Imagine que o código gerou o número 0, com o "+ 1", teremos 1 como resultado. Caso o resultado gerado fosse 1, seria adicionado 1 a esse resultado, gerando então o número 2. Por fim, sendo o resultado 2, soma-se 1 e teríamos 3 como resultado.

  • Ou seja, os resultados possíveis passam a ser 1, 2 ou 3, sendo que, originalmente podem ser 0, 1 ou 2, mas adicionamos 1 e temos 1, 2 ou 3.


Código sugerido:

let numeroAleatorio1a3 = parseInt(Math.random() * 3 + 1);

*Com "+ 1" dentro dos parênteses.

  • 1. É gerado um número aleatório entre 1 e 3,999... (com "Math.random() * 3 + 1"): Notem que aqui temos um número que está entre 1 e 3,999..., não um número entre 1 e 3, ou seja, não atingimos o objetivo da questão ainda. Lembre-se que, no código anterior, nessa fase era gerado um valor entre 0 e 2,999.... Com o "+ 1" dentro dos parênteses, o número gerado aqui estará entre 1 e 3,999....

  • 2. O número gerado é arredondado para baixo (com "parseInt(...)") Agora, removemos as casas decimais do número gerado (que pode ir de 1 até 3,999... por enquanto). Por exemplo, se for gerado o número 1,452..., teremos 1 como resultado, se for gerado o número 2,000293, teremos 2 como resultado e se for gerado, por exemplo, o número 3,81202... o resultado que teremos será 3. Com isso, os únicos resultados possíveis para esse código até agora são 1, 2 ou 3 (que é o objetivo da questão.

  • Ou seja, os resultados possíveis nesse código são 1, 2 ou 3.


Com toda essa explicação, podemos concluir que os dois códigos estão corretos! Tendo o parênteses de fechamento antes ou depois do "+ 1", o que mude é apenas o momento onde será adicionado 1 ao número gerado. No primeiro código, será adicionado após termos o número 0, 1 ou 2 como resultado. No segundo código, é adicionado logo no início, gerando um número entre 1 e 3,999... e então arredondando esse resultado.

Não vejam um código como correto e outro como incorreto. Os vejam como diferentes!

A questão poderia ter qualquer um dos dois códigos na alternativa correta que ainda faria sentido.

Ainda com essa conclusão, muuito obrigado por deixarem aqui seus pontos e posicionamentos!

Sigo à disposição para ajudar quando precisarem! Até a próxima!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Perfeito!! Agora entendi!! Obrigada =)