Mais complexo que eu imaginava random!

25 respostas
F

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

25 Respostas

F

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
            }
            
           
               
    }
        
    }
sergiotaborda

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

sergiotaborda

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);
}
T

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.

F

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

F

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

sergiotaborda

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 
  }
}
F

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+

B

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);
		}
	}
}
F

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   
            }   
               
             
                 
    }   
           
    }
B

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.

F

alguem ai pode me adicionar no msn ou deixar ai prara min fazer umas perguntas sobre estes algoritimos???
meu msn
[email removido]

sergiotaborda

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.

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}

B

Ótima abordagem do Sérgio também.

T

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…

sergiotaborda
filipibh:
agora analisando minha logica onde foi que eu errei?

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.

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
[/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

F

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
T

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.

F

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]);
        }
sergiotaborda

filipibh:
Logica

bom não consigo ver meu erro no que diz a logica continuo teimando que minha logica tinha que funcionar

não dá para explicar pq o seu algoritmo não funciona. simplesmente não funciona. E a prova é que não funciona.
Teime quanto quiser, mas não é assim.

O while teste apenas uma vez e isso é o erro. Enquanto não entender isso vc não vai entender nada mais.
Execute o programa linha a linha e verá. (sete numale = 1 em vez de = random.next() )

Suellen_Susu

Bom, eu vi o código de vcs mas ainda falta algumas coisas no q preciso fazer:

Estou fazendo um TCC, q é um jogo tipo Quiz (q ja faz conexão com o banco de dados MySql), e precisava saber como posso criar, pelo NetBeans, um array q guade o meu total de perguntas q possuo do banco, mas q ao msmo tempo funcione d forma randômica, fazendo com q as perguntas ñ sejam apresentadas ao usuário sempre na msma ordem, e q ñ repita a msma pergunta depois q for mostrada ao usuário.

Grata a qm puder me ajudar!

Grande abraço!

Suellen_Susu

Pessoal, estou aqui novamente…

Então, esses dias atrás me responderam a respeito do código randômico que estava em dúvida. Preciso fazer um random que pegue todas as questões do meu banco de dados e a cada clique do botão Responder, ele mostre outra questão, aleatoriamente. Estou fazendo um Quiz, em java, no NetBeans (este é meu TCC). Realizei alterações no código que me mandaram mas ñ entendi o porque que ele não executa.
Coloquei o código do randomico logo após o código que avalia a ultima alternativa, se ela é correta ou não. O pontos.id se refere aonde esta a variável id, na classe pontos. Só que neste primeiro for, onde está em vermelho, ele não identifica o id como variavel do prgrama e não pesquisa os códigos das perguntas (poiso id no banco é o número de cada questão). E se estiver algo mais errado no código, podem me mostrar.
Alguém poderia me ajudar? Quanto mais depressa melhor!

Obrigada, grande abraço!

[i]for(int [color=red]pontos.id[/color]=-1;[color=red]pontos.id[/color]<1;pontos.id++);

{

Random ale=new Random();

int numale=ale.nextInt(10);

for (f=0;f<vet.length;f++)

{

while(numale==vet[f])

{

int numale2=ale.nextInt(10);

numale=numale2;

}

}

vet[pontos.id]=numale;

new NewJFrame(vet[pontos.id]).setVisible(true);

} //fecha o primeiro for
this.dispose();

} //fecha o ActionPerformed (ação do botão) [/i]

tgmarinho

crie um tópico para a sua dúvida =) acho q vai receber + visitas e o pessoal vai ajudar, ctz!
eu em particular não sei!

Suellen_Susu

mas como que cria um tópico?? (desculpa minha ignorância, sou novata aqui no site!)

tgmarinho
Suellen_Susu:
mas como que cria um tópico?? (desculpa minha ignorância, sou novata aqui no site!)

Primeiro vc entra no tópico referente ao assunto, por ex, esse q vc postou refere-se a Java Básico, então vc clica em Java Básico, logo abaixo dos menus Meus DAdos | Mensagens Privadas | Minhas Mensagens | Favavoritos | etc | tem NOVO TÓPICO, ae vc clica nele abrira uma página pra vc, dae vc digita o assunto, ou seja a sua duvida.

ae embaixo vc digita alguma mensagem, ou seja, copia e cola essa duvida.

se for algum código em java, vc deve utilizar [code] //codigos java [\code] para deixar o código formatado e para uma boa leitura!

ok

"ninguem nasceu sabendo tudo".

T+

Criado 11 de abril de 2008
Ultima resposta 30 de mar. de 2010
Respostas 25
Participantes 6