Solucionado (ver solução)
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.