Mais complexo que eu imaginava random!

to precisando de um algoritimo que gere em um vetor 6 numeros de 0 a 10 e depois os emprima porem
estes 6 numeros não podem se repetir ,ja tentei fazer e não é tão simples quanto parece, existem algo pronto em java que me atenda ou tem que implementar na unha mesmo??

o caso é que não to conseguindo implementar a logica se alguem puder me ajudar

ta ai o meu codigo ta quase funcionando tem alguma coisinha errada pq as veses ele ta repetindo e não imprime os 6 numeros distintos.
se alguem puder me ajudar a enchergar o erro desde já agradeço.


import java.util.Random;


public class Main {
      
      
    public static void main(String[] args)
    {
           
        int vet[]=new int[6];
        int f;
        for(int i=0;i<6;i++)
        {
            
            Random ale=new Random();
            int numale=ale.nextInt(10);  //gera 1º aleatorio
            for( f=0;f<vet.length;f++)
            {
                while (numale==vet[f])   //confere cada posição do vetor para ver se o numero gerado ja existe
                {
                    int numale2=ale.nextInt(10);  //se numero gerado ja existe ele gera um novo numero aleatorio
                    numale=numale2;         // adiciona o novo numero aleatorio a variavel do primeiro aleatorio
                }                  //isso ocorre até que o numero aleatorio não exista em nenhuma casa do vetor
                
            }   
            vet[i]=numale;    //adiciona o numero aleatorio na primeira posicao do vetor
             System.out.println(vet[i]);   //imprime na tela o vetor
            }
            
           
               
    }
        
    }
    

Perdi a conta de quantas vezes isso foi pedido no GUJ.
Apenas procure no GUJ e vc vai encontrar a resposta.

só porque vc mostrou que tentou vou-lhe mostrar outra opção


// inicializa uma lista com os valores válidos
List<Integer> numeros = new LinkedList<Integer>();

for (int n =0; n < 11 ; n++){
    numeros.add(n);
}

// mistura aleatoriamente
Collections.shuffle(numeros); 

// pega 6 numeros
Lista<Integer> resposta = numero.subList(0,5);

// imprime a lista

for (Integer i : resposta){
  System.out.println(i);
}

Um dado (dadinho, aquele de 6 lados) também não funciona no seu caso, porque os números também se repetem.

Você tem de fazer exatamente igual a um sorteio de bolinhas de bingo, ou seja, você tem de ver se o número já foi sorteado.

cara to até com vergonha vc comentou e não entendi perdoe a burrice, da pra desenhar(explicar de outra forma)
?

tingol

while (numale==vet[f])  

essa linha de comnado pelo menos na minha cabeça faz isso pq ela esta no segundo for encadeado ou seja o f corre todo o vetor cada ver que o i anda uma casa

isso que to querendo saber se ta errado no meu codigo

vamos lá então … (eu não me importo de me repetir, só que pelas regras de netetiqueta isso pode ser considerado flooding :shock: :roll: )

 public class Main {  
                 
 public static void main(String[] args)      {  
          
      Random random =new Random(); 
      int vet[]=new int[6];  

      for(int i=0;i<6;i++)  {  
               
           int numale=random.nextInt(10);  //gera 1º aleatorio  
           //confere cada posição do vetor para ver se o numero gerado ja existe
           boolean acceptable = false ; // o numero aleatorio foi aceite ?
           while (!acceptable ){
                 iteracao: for( int f=0;f<vet.length;f++)  {  
                     if (vet[f]==numale){
                         numale =ale.nextInt(10);  //se numero gerado ja existe ele gera um novo numero aleatorio 
                                                           // subtituindo o antigo e tenta de novo
                          // começa o for do principio
                          continue iteracao;
                    }
                }
                // se ele chegou aqui é porque o numero foi aceite
                acceptable = true;
           }

            vet[i]=numale;    //adiciona o numero aleatorio na posicao do vetor  
              System.out.println(vet[i]);   //imprime na tela o vetor  
       }  
    } 
}

em faria de uma forma um pouco mais legivel

 public class Main {  
                 
 public static void main(String[] args)      {  
          
      Random random =new Random(); 
      int vet[]=new int[6];  

      for(int i=0;i<6;i++)  {  
               
           int numale=random.nextInt(10);  //gera 1º aleatorio  
           //confere cada posição do vetor para ver se o numero gerado ja existe
           while (jaExiste(numale, vet){
                // subtituindo o antigo e tenta de novo
                numale=random.nextInt(10)
           }

            vet[i]=numale;    //adiciona o numero aleatorio na posicao do vetor  
            System.out.println(vet[i]);   //imprime na tela o vetor  
       }  
  } 

  private static boolean jaExiste(int valor , int[] array){
         for (int i =0; i < array.length; i++){
             if (valor==array[i]){
                 return true; // existe
            }
        }
        return false; //não existe 
  }
}

o triste de tudo isto é imaginar que fiquei uns 2 dias tentando fazer isso fiz de tudo que é forma desenvolvi logica com 3 for e um while encadeado com 2 for e num consegui
brincadeira viuuuu
heheh valew ai pela ajuda.
mas eu gostaria depois de postar novamente meu codigo para ver se alguem me ajuda a identicar meuerro logico t+

Cara, não é tão difícil não:

import java.util.LinkedList;
import java.util.Random;
import java.util.Vector;

public class TesteBingo {

	private static final int NUMEROS_BINGO = 10;
	private static final int NUMEROS_SORTEADOS = 6;

	public static void main(String[] args) {
		Random r = new Random();
		LinkedList<Integer> numeros = new LinkedList<Integer>();
		for (int i = 0; i < NUMEROS_BINGO; i++)
			numeros.add(i);
		Vector<Integer> sorteados = new Vector<Integer>();
		while (sorteados.size() != NUMEROS_SORTEADOS) {
			int numSorteado = numeros.remove(r.nextInt(numeros.size()));
			sorteados.add(numSorteado);
			System.out.println("Sorteado: " + numSorteado);
		}
	}
}

agora analisando minha logica onde foi que eu errei?

import java.util.Random;   
  
  
public class Main {   
         
         
    public static void main(String[] args)   
    {   
             
        int vet[]=new int[6];   
        int f;   
        for(int i=0;i<6;i++)   
        {   
               
            Random ale=new Random();   
            int numale=ale.nextInt(10);  //gera 1º aleatorio   
            for( f=0;f<vet.length;f++)   
            {   
                while (numale==vet[f])   //confere cada posição do vetor para ver se o numero gerado ja existe   
                {   
                    int numale2=ale.nextInt(10);  //se numero gerado ja existe ele gera um novo numero aleatorio   
                    numale=numale2;         // adiciona o novo numero aleatorio a variavel do primeiro aleatorio   
                }                  //isso ocorre até que o numero aleatorio não exista em nenhuma casa do vetor   
                   
            }     
            vet[i]=numale;    //adiciona o numero aleatorio na primeira posicao do vetor   
             System.out.println(vet[i]);   //imprime na tela o vetor   
            }   
               
             
                 
    }   
           
    }   

O Random tu pode declarar fora do laço, já que ele está sendo instanciado toda vez que o laço é executado.

Você errou no fato de querer comparar cada número sorteado com todos os que já estão no vetor de sorteados.
O que você deve fazer é criar uma coleção com todos os objetos (números) que podem ser sorteados e a cada um que for sorteado, removê-lo da coleção.
Desse modo o algoritmo fica mais simples e temos um menor processamento.
Pode fazer com um vetor de int se quiser, seta o número pra -1 e verifica se é -1, se for, sorteia novamente. Mas aí também teremos um processamento desnecessário, o ideal é fazer como eu lhe mostrei, uma lista na qual os objetos sorteados são removidos.

alguem ai pode me adicionar no msn ou deixar ai prara min fazer umas perguntas sobre estes algoritimos???
meu msn
djwebdance@hotmail.com

[quote=brunoleite]O
Você errou no fato de querer comparar cada número sorteado com todos os que já estão no vetor de sorteados.
O que você deve fazer é criar uma coleção com todos os objetos (números) que podem ser sorteados e a cada um que for sorteado, removê-lo da coleção.
Desse modo o algoritmo fica mais simples e temos um menor processamento.
[/quote]

Vc não precisa removê-lo porque vc tem acesso a toda a coleção.
Na realidade a unica coisa que vc é necessário é misturar aletariamente os elementos na coleção.
Vc pega todos de uma vez , não precisa ser um a um.

Coleção = {1,2,3,4,5,6,7,8,9,10}

baralhar

Coleção = {10,8,9,1,4,2,7,3,6,5}

pega 6

Resultado = {10,8,9,1,4,2}

Ótima abordagem do Sérgio também.

A abordagem do Sérgio é fácil de fazer em Java.

List<Integer> numeros = new ArrayList<Integer>();
for (int i = 0; i <= 10; ++i) {
    numeros.add (i);
}
Collections.shuffle (numeros);
for (int i = 0; i < 6; ++i) {
    System.out.println (numeros.get(i));
}

Obviamente, se o número de alternativas possíveis for realmente muito grande (digamos 1 bilhão de alternativas :stuck_out_tongue: ), é melhor procurar se o número já foi sorteado…

[quote=filipibh]agora analisando minha logica onde foi que eu errei?
[/quote]

  1. usar while para fazer o trabalho de if.
  2. usar um ciclo a mais
  3. Como o bruno falou, criar Random dentro do for.
  4. declarar f fora do for.

[code]
import java.util.Random;

public class Main {

public static void main(String[] args)   
{   
    Random ale=new Random();      
    int vet[]=new int[6];   
    for(int i=0;i<6;i++)   // itere todos os items a preencher
    {   

        int numale=ale.nextInt(10);  //gera 1º aleatorio   
        for( int f=0;f<vet.length;f++)   // para cada 
        {   
            while (numale==vet[f])   // itera enquanto o numero está no array !!! isso vai ser false logo   

[/code][/quote]

while ( numale == vet[f] ) simplesmente não faz sentido. Vc tem que comparar numale com todos os valores já no vector antes de continuar e não apenas com o item corrente

Logica

bom não consigo ver meu erro no que diz a logica continuo teimando que minha logica tinha que funcionar
tenho um vetor de 6 posições a cada numero aleatorio que é gerado ele verifica se ja existe no vetor se existe ele gera outro numero se não existe no vetor ele adiciona o numero no vetor
onde ta o erro ai???
segue o codigo mais uma vez continuo achando que não consigui implementar oq eu pensei

import java.util.Random;

public class Main 
{     
                   
    public static void main(String[] args)      
    {     
          
        Random random =new Random();   
        int vet[]=new int[6];     
        for(int i=0;i<vet.length;i++)
        {
            int num=random.nextInt(6);//gera numero aleatorio
            for(int j=0;j<vet.length;j++)
            {
                while (num==vet[j])  //enquanto numero for = a qualquer posição do vetor
                {
                     num=random.nextInt(6);//gera outro
                }
             
            }
             vet[i]=num;   
             System.out.println(vet[i]);
        }    
      
           
           
    }//fecha void   
}  //fecha classe
   

Você sabe usar métodos? Faça o seguinte: crie um método que serve só para saber se um determinado elemento está dentro de

Minha experiência diz que quando você faz um for (ou while) dentro de outro for (ou while) dentro de outro for (ou while) , a probabilidade de não dar certo é muito grande.

não to utilizando while no lugar de if
oq acontece é o seguinte enquanto num==vet[j] ele vai gerando numeros até que esta condição seja diferente

while (num==vet[j])  //enquanto numero for = a qualquer posição do vetor
                {
                     num=random.nextInt(6);//gera outro
                }

se eu colocar por exemplo o if como abaixo oq acontece, ele compara sem problemas, porem se o num for = ao vet [j] ele gera outro numero , mas pode acontecer do segundo numero gerado coincidir de ser = ao primeiro numero gerado ai o erro continua no codigo

if (num==vet[j])  //enquanto numero for = a qualquer posição do vetor
                {
                     num=random.nextInt(6);//gera outro
                }

sendo assim tenho que usar while mesmo o while força a condição até que ela seja diferente

quanto ao gerar o ramdon dentro do for é muito simples se eu fizer como no exemplo abaixo gerando fora do for todos os 6 numeros serão iguais isso utilizando o random dentro do for isso garante que a cada vez que percorrer o for uma nova chamada de numero será feita e assim serão numeros “teoricamente diferentes”;

Random random =new Random();   
        int vet[]=new int[6];     
       int num=random.nextInt(6);//gera numero aleatorio   
        
for(int i=0;i<vet.length;i++)
        {
         
           
             vet[i]=num;
            
             System.out.println(vet[i]);
        }