Boa tarde amigos, sou iniciante e estou com dúvida em um código que estou desenvolvendo para estudo da classe Random(); , enfim… eu tenho 2 números aleatórios onde eu comparo com números de posições de um vetor de String de 21 posições, cujo qual, tem atributos que quero fazer uma contagem de quantas vezes precisou rodar para cair tais atributos(Quero 11 e 19 ou vice e versa). Porém ao realizar os testes, reparei que na minha condição While, assim que um dos números desejados é sorteado, ele sai fora do While, ja tentei diversas formas e nada. Desde então o código está assim, Alguém da uma força?
Bloco de Citação package application;
import java.util.Random;
public class Program {
public static void main(String[] args) {
Random rd = new Random();
int numeroAleatorio1 = rd.nextInt(20) + 1;
int numeroAleatorio2 = rd.nextInt(20) + 1;
System.out.println("1° Numero: " + numeroAleatorio1);
System.out.println("2° Numero: " + numeroAleatorio2);
String atributos[] = new String[22];
atributos[0] = "Inteligência: +5";
atributos[1] = "Força: +5";
atributos[2] = "Destreza: +5";
atributos[3] = "Bônus contra Shamans: 10%";
atributos[4] = "Chance de Perfurar: +5%";
atributos[5] = "Bônus contra Shuras: 10%";
atributos[6] = "Resistência contra Shamans: 5%";
atributos[7] = "Velocidade de Movimento: +8%";
atributos[8] = "Resistência contra Shuras: 5%";
atributos[9] = "Bônus contra Guerreiros: 10%";
atributos[10] = "Resistência contra Ninjas: 5%";
atributos[11] = "Ataque: +50";
atributos[12] = "Resistência contra Lycans: 5%";
atributos[13] = "Bônus contra Lycans: 10%";
atributos[14] = "Vitalidade: +5";
atributos[15] = "Bônus contra Ninjas: 10%";
atributos[16] = "Resistência contra Guerreiros: 5%";
atributos[17] = "Chance de Ataque Crítico: +5";
atributos[18] = "MP Máximo: +50";
atributos[19] = "Bônus contra Monstros: 10%";
atributos[20] = "HP Máximo: +500";
atributos[21] = "Velocidade de Ataque: +2%";
int contadorArumaka = 0;
while ((numeroAleatorio1 != 11) && (numeroAleatorio2 != 19)) {
numeroAleatorio1 = rd.nextInt(20) + 1;
numeroAleatorio2 = rd.nextInt(20) + 1;
contadorArumaka += 1;
}
for (int i = 0; i < atributos.length; i++) {
if (numeroAleatorio1 == i) {
System.out.println(atributos[i]);
}
}
for (int j = 0; j < atributos.length; j++) {
if (numeroAleatorio2 == j) {
System.out.println(atributos[j]);
}
}
System.out.println("Foram rodadas as jollas " + contadorArumaka + " vezes para cair os ADDs --> "
+ atributos[11] + "/" + atributos[19]);
}
Você criou um vetor de 22 posições cujo os índice estão variando de 0 a 21, mas você está sorteando um número de 1 a 21: int numeroAleatorio1 = rd.nextInt(20) + 1;
Exceto, se você não quiser sortear o zero, o correto seria de 0 a 21: int numeroAleatorio1 = rd.nextInt(21);
Agora a possível causa do seu problema é que você estava usando o && em vez do ||, na condição abaixo, o correto seria assim:
/* se o número1 =! 11 ou numero2 != 19 o loop deve continuar.
* se não, numero1 == 11 e numero2 ==19 o loop terminar.
*/
while ((numeroAleatorio1 != 11) || (numeroAleatorio2 != 19)) {
numeroAleatorio1 = rd.nextInt(20) + 1;
numeroAleatorio2 = rd.nextInt(20) + 1;
contadorArumaka += 1;
}
Obrigado pela resposta e pela correção, agora deu certo, mas tenho a impressão que já tinha tentado dessa forma e o erro persistia, cabeça cansada acredito que nem tenha reparado rsrs!
E no caso de eu querer fazer vice e versa? Porque tem essa possibilidade de dentro do While sortear n1 = 19 e n2 = 11, que também estaria certo, não necessáriamente o n1 tem que ser 11 e n2 = 19…
Aumento as condições de While ou faço um If Dentro do mesmo?
Boa pergunta, essa solução é viável, o único problema é se depois você quiser aumentar a quantidade de número. Exemplo:
Atualmente é “n1” é “n2” e existe 4 possiblidade n1 = 19 n2 = 11 e o inverso também!
Agora se for “n1”, “n2” e “n3”, vão ser 6 possibilidades, desse jeito, enchendo o seu while de condições!
Uma alternativa para esse problema que pensei agora, é adicionar esses números, no qual você que verificar em uma lista e remover a medidas que eles aparecerem (talvez exista alternativas melhores). Ex:
import java.util.*;
class Main {
public static void main(String[] args) {
Random rd = new Random();
int count = 1;
//número
int[] n = {11,19};
ArrayList<Integer> aux = new ArrayList<>();
aux.add(n[0]);
aux.add(n[1]);
int valor = rd.nextInt(21);
//enquanto a lista não estiver vazia o loop continua!
while(!aux.isEmpty()){
System.out.println("Valor: "+valor);
//Se o número sorteado estiver na lista o remova!
int indiceValor = aux.indexOf(valor);
if(indiceValor !=-1){
aux.remove(indiceValor);
System.out.println("Removeu o "+valor);
}
//Sortear outro!
valor = rd.nextInt(21);
count++;
}
System.out.println("Quantidade de Vezes: "+count);
}
}
Perceba também é que ficar chamando Random.nextInt(21) fica gerando número repetidos também, Se você você que gerar números aleatorio de 0 a 21 sem se repetir da uma olhada nesse tópico, sobre Globo da sorte:
Eu só quis te mostrar algumas alternativas. Se você quer verificar só dois números e não uma quantidade muito grande, além disso se sua solução funcionou para o que você queria, as implementações acima pode ser apenas complicações desnecessárias. Mas fica alguma sugestões!!
Qualquer melhoria é bem vinda, e sim, isso que você mandou sobre aumentar a quantidade de números, é uma das intenções, obrigado por compartilhar um pouco de conhecimento! TMJ