Solucionado (ver solução)

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!

Solucionado
(ver solução)
14
respostas

Discordo do resultado dessa resposta

Ao meu ver quando vc executa o Math.round nessa opção:

var numeroAleatorio = Math.round(Math.random() * 1000);

Vc consegue alcançar os 4 dígitos mesmo que a chance seja pequena . Ex: 0.9999987726 = 1000

E nesse caso vc pode alcançar até 5 dígitos:

var numeroAleatorio = Math.round(Math.random() * 10000);

Ex: 0.99988999 = 10000

E se esse valor fosse guardado em um banco e dados que prevesse apenas os 4 dígitos?

14 respostas

Olá Luis,

a função Math.random() devolve um número decimal, cujo menor valor possível que ele devolve é 0 e o maior valor possível é 1. Se você tem uma situação em que pode guardar até 4 dígitos, então você quer números aleatórios entre 0 e 9999. Então multiplicando o Math.random() por 9999 ao invés de 10000, o menor valor possível desta conta será 0 (0 * 9999) e o maior valor será 9999 (1 * 9999). E como o resultado da conta será um número decimal, o Math.round() simplesmente arredonda para um inteiro entre 0 e 9999.

Vamos analisar a questão:

Enunciado: Qual das opções abaixo gera um número aleatório com 4 dígitos?(Única escolha)

a)var numeroAleatorio = Math.round(Math.random() * 3); gera números de [0 a 1] * 3 = [0 a 3] (portanto 1 dígito)

b)var numeroAleatorio = Math.round(Math.random() * 10000); 10000 * gera números de [0 a 1] = [0 a 10000] (portanto 5 dígitos)

c)var numeroAleatorio = Math.round(Math.random() * 1000); 1000 * gera números de [0 a 1] = [0 a 1000] (portanto 4 dígitos)

d)var numeroAleatorio = Math.random(Math.round() * 10000); gera números de [0 a 1] * 10000 = [0 a 10000] (portanto 5 dígitos)

Portanto concordo perfeitamente com o colega a B,C e D estão corretas pois todas elas geram números de 4 dígitos como pergunta o enunciado. Se o enunciado fosse alterado para números até 4 dígitos teríamos como resposta correta a letra C, se o enunciado fosse alterado para quais opções geram números de 4 dígitos teríamos como resposta as letras b,c, d. Ou seja a resposta ideal seria mesmo 9999, já que 10000(gera 5 dígitos).Bem observado.

Lucas compreendo sua resposta! Então logo á opção b (considerada á correta), não é correta! Pois como vc disse : Se você tem uma situação em que pode guardar até 4 dígitos, então você quer números aleatórios entre 0 e 9999. Então multiplicando o Math.random() por 9999 ao invés de 10000, o menor valor possível desta conta será 0 (0 9999) e o maior valor será 9999 (1 9999). E como o resultado da conta será um número decimal, o Math.round() simplesmente arredonda para um inteiro entre 0 e 9999.(Sic). O amigo Maison partilha do mesmo racíocinio.

Oi pessoal! O problema é que uma sugestão do aluno foi aceita por um dos nossos moderadores e causou essa inconsistência.

Eu vou alterar para ficar direitinho.

Obrigado pelo retorno pessoal!.

A função Math.random() retorna um número entre 0 (inclusivo) e 1 (exclusivo). É um número de ponto flutuante por exemplo 0.8563647098333853. Se multiplicarmos o número por 100, teremos 85.63647098333853. Por fim, se arredondarmos o número com Math.round(85.63647098333853) teremos 86. Dentro desse contexto se fizermos Math.round(Math.random() * 100) teremos um número de dois dígitos. Contudo, o resultando de Math.random() pode ser 0.011871734387907118. Se multiplicarmos este número por 100, teremos 1.1871734387907118. E claro, se formos arredondá-lo com Math.round teremos 1. Sendo assim, o resultado de Math.round(Math.random() * 100)) pode resultar em um número de até 2 dígitos.

Todos concordam? :)

Flavio bom dia!Eu discordo! Executei no meu console a alcancei 100, 3 dígitos. Eu entendo que ao executar o Math.round(Math.random() * 100)), vc terá como menor valor 0 e maior valor 100. O conceito matemático de andar as casa é super válido (10 uma casa, 100 duas casas...), mas usando arrendodamento podemos alcançar um valor entre 0 e o valor do seu multiplicador. Logo o exercício pede um número aleatório de 4 dígitos esse multiplicador não pode ser maior que 9999 e nem menor que 1000.

Não me referi ao exercício, apenas ao conceito. Você rodou o código que postei e deu mais de 2 digitos? Eu nao quero introduzir a função floor porque é um curso de lógica e não api.

solução!

Realmente, pelo arredondamento pode dar 3 dígitos por causa do Math.round com certeza. Sendo assim, que arredonda para cima. O lance esta no arredondamento.

Eu posso alterar o exercício sim, mas no seu caso, como você foi além, então vou um pouco além também, apesar dessa não ser minha atenção, pois focar em uma api afasto o aluno da lógica.

Você pode usar floor no lugar de random. A primeira arredonda para baixo, diferente da segunda que arredonda para cima. Dessa forma, não teremos 3 dígitos e sim 2.

Math.floor(Math.random() * 100)

Vamos lá, primeiramente como o instrutor Flávio bem disse a função Math.random() - Retorna um valor double com um sinal positivo, maior ou igual a 0.0 e menor que 1.0. : vide API do Java - Random()

0.3496432147514028

0.5536654355654429

0.9686725887939587

Logo se fizermos

Math.round (Math.random() * 100)) teremos por exemplo:

Math.round((0.9986725897939587 ) * 100)

Math.round((99.86725887939587 ) )= 100

Pois a função Round() = Retorna o mais próximo long ao argumento, com laços de arredondamento para o infinito positivo. API do Java - Round()

0.0210646168774073 = 0

0.9686725887939587 = 1

logo, concluo que:

Math.round(Math.random() * 100)) = 3 dígitos

Math.round(Math.random() * 1000)) = 4 dígitos

Math.round(Math.random() * 1000)) = 5 dígitos

OK Flavio! Obrigado! E verdade a questão destoa da idéia principal que é a lógica. Agradeço a atenção.

Eu to curtindo a discussão. Até porque, como colocar uma compilação de tudo que vimos aqui como resposta no exercícios.

Luis, mas você esta corretíssimo.. se o enunciado esta com problema, eu tenho que corrigir. Mais do que corrigir, eu vou colocar como explicação do instrutor esses detalhes aqui.

Quando evitei o uso de floor acabei me enganando a respeito do random.

Mas para a discussão chegar ao fim, precisamos chegar a um denominador. :)

Aguardo seu retorno.

Eu vejo como solução usar Math.floor(Math.random() * 100) para arredondar para baixo, pq ele consolida o conceito matématico (multiplicar por 10 uma casa, por 100 duas casas...).Mas ficou bem claro pra mim! Confesso que ao ver a exercício pensei em uma pegadinha por causa do Math.round(). Agradeço mais uma vez a todos que participaram. Bacana a discussão.

Boa! Vou reformular a questão e ainda explicar o floor de bônus. Só não vou conseguir fazer isso hoje.