Bom pessoal estou tentando criar uma função que inicialmente ele deve verificar se o numero randômico esta contido dentro de do vetor criado e dai começa como o vetor e novo ele não tem elemento então eu chamo outra função que direciona este valor para atribuir uma imagem , depois uma nova condição de que se o valor já estiver no vetor ele chama novamente esta mesma função para chamar um numero aleatório e começar novamente a função, eu fiz isso aqui só que ta dando errado. Se alguém puder me auxiliar ai grato ficarei grato.
public void sorteiaJogadaSemRpetir(View view) {
int [] valores = {};
Random numeroRandomico = new Random();
int valorRandomicoInteiro = numeroRandomico.nextInt(10);
for (int i = 0; i < valores.length; i++){
if (valores[i] == valorRandomicoInteiro){
System.out.println("Valor fora do vetor");
sorteiaJogada(view);
valores.add(valorRandomicoInteiro);
}else{
sorteiaJogadaSemRpetir(view);
}
}
}
No mundo real, como é que são sorteados números sem repetir?
Coloca todos os números num recipiente e vai removendo aleatoriamente.
Dá uma olhada no Globo da Sorte implementado neste post, deve atender sua necessidade.
O vetor está vazio mesmo. Você não passou nenhum valor pra dentro do valor. E aí como você conta (do verbo contar (1, 2, 3, …)) algo vazio? Não tem como.
Você tem que fazer um if verificando se o vetor tá vazio. Se tiver vazio, então, você não percorre, mas tiver algum valor dentro do vetor você percorre o vetor.
if(valores.length > 0){
// aí você percorre o vetor.
}
Mas tem um porém, você inicializou o array como vazio, e o tamanho de um array não pode ser alterado depois de criado! Então antes de adicionar um valor você deve especificar o tamanho!
Se você não sabe o tamanho ou se ele é variado, pense em utilizar um ArrayList.
array não possuem o método add()!?
Tenta explicar melhor, com algum exemplo, eu não entendi! Pegando a ideia do lucas, Seria isso?
public void sorteiaJogadaSemRpetir(View view) {
ArrayList<Integer>() valores = new ArrayList<>();
Random numeroRandomico = new Random();
int valorRandomicoInteiro = numeroRandomico.nextInt(10);
// A lista tá vazia
if(valores.isEmpty()){
sorteiaJogada(view);
valores.add(valorRandomicoInteiro);
}
//A lista não tá vazia, então verifico se o o número já existe!
else{
for (int i = 0; i < valores.size(); i++){
// O número não existe na lista!
if (valores.get(i) != valorRandomicoInteiro){
System.out.println("Valor fora do vetor");
sorteiaJogada(view);
valores.add(valorRandomicoInteiro);
break;
}else{
sorteiaJogadaSemRpetir(view); // aqui ele existe!
break;
}
}
}
}
Edit: No ArrayListajá existe um metodo que verifica se um elemento existe na lista:
public void sorteiaJogadaSemRpetir(View view) {
ArrayList<Integer>() valores = new ArrayList<>();
Random numeroRandomico = new Random();
int valorRandomicoInteiro = numeroRandomico.nextInt(10);
//ele não existe na lista!
if (!valores.contains(valorRandomicoInteiro)){
System.out.println("Valor fora do vetor");
sorteiaJogada(view);
valores.add(valorRandomicoInteiro);
}else{
sorteiaJogadaSemRpetir(view);
}
}
Método recursivo para sortear valores entre 0 e 9 sem repetir?
Já pararam pra pensar quantas vezes esse método será executado?
Façam uma lista com os números de 0 à 9 e vão removendo os números aleatoriamente, simples assim.
eu tentei fazer aqui mas no meu caso ja preciso ter um vetor com elementos ja pra inseridos, e como ele disse depois ir tirando um elemento a medida que eu sortear um novo numero randomico lembrando que eu ativo essa função por um botao pra gerar este numero randomico.
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class GloboDaSorte {
private List<Integer> numeros = new ArrayList<>();
public GloboDaSorte(int de, int ate) {
for (int numero = de; numero <= ate; numero++) {
numeros.add(numero);
}
}
public int sortear() {
if (numeros.isEmpty()) {
throw new IllegalStateException("Todos os números já foram sorteados!");
}
Random random = new Random();
int sorteado = random.nextInt(numeros.size());
return numeros.remove(sorteado);
}
public boolean podeSortear() {
return !numeros.isEmpty();
}
}
Você pode utilizar ela para sortear números de um determinado intervalo, sem repetir.
Veja um exemplo sorteando números de 0 à 9:
GloboDaSorte numeros = new GloboDaSorte(0, 9);
while (numeros.podeSortear()) {
int numero = numeros.sortear();
System.out.println(numero);
}