Não consigo entender a lógica para que não se repita os números iguais.
Alguem pode me ajudar? estou com muitas duvidas nessa Aula.
Não consigo entender a lógica para que não se repita os números iguais.
Alguem pode me ajudar? estou com muitas duvidas nessa Aula.
Aqui também está voltando números repetidos, inclusive 0.
Olá, Diego, tudo bem?
Primeiramente parabéns por ter chegado às últimas aulas do curso!
Você poderia dizer suas dúvidas específicas para que possamos te ajudar melhor! De qualquer forma, vou te mostrar passo a passo de como implementar essa parte, ok? Espero que te ajude.
Vamos considerar o código da função sorteiaNumeros
, antes do instrutor implementar a lógica de impedir números repetidos:
function sorteiaNumeros(quantidade) {
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia(); // Sorteamos um novo número
segredos.push(numeroAleatorio); // Adicionamos o novo número
numero++;
}
return segredos;
}
O que essa função faz é receber uma quantidade
como parâmetro e retornar um array segredos
com a quantidade de números aleatórios infromada. Para isso, utilizamos o bloco while
e a variável numero
, que é como se fosse uma variável contadora (você pode renomeá-la para cont
, se preferir).
Então sempre que um novo número é sorteado e adicionado a segredos
, somamos 1 ao valor de numero
, e quando numero
for maior que a quantidade
informada, o bloco while
é quebrado!
Mas antes de executar a linha segredos.push(numeroAleatorio)
, devemos percorrer o array para conferirmos se o novo número gerado já existe dentro do array segredos
!
Faremos isso utilizando o bloco for
:
function sorteiaNumeros(quantidade) {
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia(); // Sorteamos um novo número
for (var posicao = 0; posicao < segredos.length; posicao++) {
// Aqui dentro devemos conferir se no array "segredos" já existe um número igual ao que foi gerado
}
segredos.push(numeroAleatorio); // Adicionamos o novo número
numero++;
}
return segredos;
}
Se você tiver alguma dúvida de como o bloco for
funciona, pode falar, ok?
Mas do jeito que o código está, o comando segredos.push(numeroAleatorio);
adicionará o novo número no array segredos
de qualquer jeito! Precisamos então de um bloco if
, que adiciona o novo número gerado apenas se ele não existir dentro do array. Podemos então criar uma variável auxiliar chamada achou
!
Iremos declarar essa variável inicialmente com o valor false
, antes de percorrermos o array segredos
. Em seguida, ao percorrer o array, iremos alterar o valor de achou
para true
apenas se encontrarmos um número igual a numeroAleatorio
.
E por fim, iremos executar segredos.push(numeroAleatorio)
apenas se achou
for igual a false
, pois isso quer dizer que numeroAleatorio
ainda não existe dentro do array, e podemos adicioná-lo com segurança! E se achou
for igual a true
, quer dizer que o número já existe dentro do array e não iremos adicionar o novo número!
Vamos por partes, primeiro criaremos a variável achou
logo antes de percorrermos o array, e o bloco if
para adicionar ou não o novo número dentro do array:
function sorteiaNumeros(quantidade) {
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia(); // Sorteamos um novo número
var achou = false; // Inicializamos a variável com valor "false"
for (var posicao = 0; posicao < segredos.length; posicao++) {
// Aqui dentro devemos conferir se no array "segredos" já existe um número igual ao que foi gerado
// Se encontrarmos, alteraremos o valor de "achou" para "true"
}
if (achou == false) { // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
segredos.push(numeroAleatorio);
numero++;
}
}
return segredos;
}
Continuarei no próximo post!
Agora falta apenas implementarmos a lógica dentro do for
! A variável posicao
indicará a posição de cada elemento do array, então poderemos acessar cada elemento se usarmos segredos[posicao]
. Então, começando na posição 0, iremos conferir (de um em um) se algum elemento do array é igual a numeroAleatorio
. Se houver pelo menos um elemento igual a numeroAleatorio
, alteraremos o valor de achou
para true
! Assim:
function sorteiaNumeros(quantidade) {
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia(); // Sorteamos um novo número
var achou = false; // Inicializamos a variável com valor "false"
for (var posicao = 0; posicao < segredos.length; posicao++) {
if (segredos[posicao] == numeroAleatorio) { // Aqui conferimos se cada um dos elementos é igual a "numeroAleatorio".
achou = true; // Se pelo menos um dos elementos é igual, alteramos o valor de "achou" para "true"!
break; // Aqui usamos o break para interromper a execução do "for", pois não é mais necessário procurar mais algum número igual ao novo gerado.
}
}
if (achou == false) { // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
segredos.push(numeroAleatorio);
numero++;
}
}
return segredos;
}
Nosso programa está quase pronto! Por fim, queremos adicionar o novo número gerado apenas se ele for diferente de 0! Então, logo depois de sortearmos o número, adicionaremos um bloco if
, que executará todo o código apenas se numeroAleatorio !== 0
:
function sorteiaNumeros(quantidade) {
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia(); // Sorteamos um novo número
if (numeroAleatorio !== 0) { // Executará o restante do código apenas se o número gerado não for 0. Se for 0, voltaremos ao início do "while".
var achou = false;
for (var posicao = 0; posicao < segredos.length; posicao++) {
if (segredos[posicao] == numeroAleatorio) { // Aqui conferimos se cada um dos elementos é igual a "numeroAleatorio".
achou = true; // Se pelo menos um dos elementos é igual, alteramos a valor de "achou" para "true"!
break; // Aqui usamos o break para interromper a execução do "for", pois não é mais necessário procurar mais algum número igual ao novo gerado.
}
}
if (achou == false) { // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
segredos.push(numeroAleatorio);
numero++;
}
}
}
return segredos;
}
É isso, espero ter ajudado! Se ficou alguma dúvida, estaremos aqui para te auxiliar! Bons estudos :)
Oi Antônio,
O problema dos números repetidos foi solucionado com a tua explicação, obrigado. Porém ainda estou recebendo o número 0 em um dos números sorteados:
<meta charset="UTF-8">
<input/>
<button>Compare com o meu segredo</button>
<script>
function sorteia(){
return Math.round(Math.random() * 10);
}
function sorteiaNumeros(quantidade){
var segredos = [];
var numero = 1;
while (numero <= quantidade) {
var numeroAleatorio = sorteia();
if (numeroAleatorio !== 0){
var achou = false;
for (var posicao = 0; posicao < segredos.length; posicao++){
if(segredos[posicao] == numeroAleatorio){
achou = true;
break;
}
}
}
if (achou == false){
segredos.push((numeroAleatorio));
numero++;
}
}
return segredos;
}
var segredos = sorteiaNumeros(5);
console.log(segredos);
var input = document.querySelector("input");
input.focus();
function verifica() {
var achou = false;
for(var posicao = 0; posicao < segredos.length; posicao++) {
if(input.value == segredos[posicao]) {
alert("Você ACERTOU!");
achou = true;
break;
}
}
if(achou == false) {
alert("Você ERROU!");
}
input.value = "";
input.focus();
}
var button = document.querySelector("button");
button.onclick = verifica;
</script>
Onde eu estou errando?
Math.round(Math.random() * 10);
Trocar a função round()
por ceil()
A ceil
arredonda qualquer valor com casa decimal pro proximo numero inteiro, a round
deixa no mesmo numero se o valor dass casas decimais forem menor do que 0,5 e se for maior ou igual ela arredonda pro proximo numero inteiro.
Agradeço pela sugestão e realmente funciona.
Como o professor utiliza o round, queria saber o motivo do código dele não estar retornando 0 e o meu sim!
Tranquilo, eu não cheguei a ver o código dele, mas verifica se ele esta somando 1 nessa função ou algo do tipo:
Math.round(Math.random() * 10) +1;
E usando o round nesse caso, acho que geraria um numero a mais, tipo de 1 a 11 nesse caso. e o seu esta gerando de 0 a 10.
chegou a verificar isso tb?
Sim, está praticamente igual ao do professor (alguma coisa deve estar diferente, por isso deve estar voltando 0 hehe). Vou dar uma olhada e aviso aqui quando resolver. Por enquanto, obrigado pela ajuda de vocês!