Ajuda com ArrayList e Random

estou querendo que em um frame quando for selecionado a pergunta certa. seja sorteado de um ArrayList a proxima pergunta. eu fiz só q imprime todos os labels de teste q fiz.
quando selecionado o botao correto o seguinte metodo eh chamado:


static Vector vetorFase1;
  
  void sortearPergunta(){
	  
	  vetorFase1 = new Vector();
	  
	  Perguntas per = new Perguntas();
	  per.pergunta1();
	  
	  Perguntas per2 = new Perguntas();
	  per2.pergunta2();
	   
	  Perguntas per3 = new Perguntas();
	  per3.pergunta3();
	   
	  Perguntas per4 = new Perguntas();
	  per4.pergunta4();
	  

	vetorFase1.addElement(per.pergunta1());
	vetorFase1.addElement(per2.pergunta2());
	vetorFase1.addElement(per3.pergunta3());
	vetorFase1.addElement(per4.pergunta4());
	 
	

	  
	  ArrayList <Perguntas> po = new ArrayList<Perguntas>();
	  po.add(0, per.pergunta1());
	  po.add(1,per2.pergunta2());
	  po.add(2,per3.pergunta3());
	  po.add(3,per4.pergunta4());
	  
	
Collections.shuffle(po);
 Random op = new Random();
 op.nextInt();	

	 }

quando chama vem todos os labels da classe q fiz! que estao dentro de metodos da mesma. ^^

Não use Vector, nem variáveis static.
Você poderia ter usado só o ArrayList, que é bem melhor.

Para sortear, você tem 2 opções:
a) Se você não quer perguntas repetidas: Use o método Collections.shuffle para embaralhar uma lista. Em seguida, é só pegar cada elemento da lista em ordem.
b) Se você pode repetir: Nesse caso, use a classe Random para sortear um dos índices da lista;

ficaria mais ou menos assim neh?
so que nao consigo limitar o “po” dentro do for… pra um intervalo de 0-4.

[code] void sortearPergunta(){

  Perguntas per = new Perguntas();
  per.pergunta1();
  
  Perguntas per2 = new Perguntas();
  per2.pergunta2();
   
  Perguntas per3 = new Perguntas();
  per3.pergunta3();
   
  Perguntas per4 = new Perguntas();
  per4.pergunta4();
  

  ArrayList <Perguntas> po = new ArrayList<Perguntas>();
  po.add(0, per);
  po.add(1,per2);
  po.add(2,per3);
  po.add(3,per4);

Collections.shuffle(po);
Random op = new Random(4);

for (int i = 0; i <1; i++) {
po.get(op.nextInt());
}
[/code]

É só passar 4 no parâmetro do nextInt():

po.get(op.nextInt(4));

E retire o 4 da inicialização do Random, essa é a semente que define os números que serão gerados. Se deixar ele lá as perguntas sempre serão sorteadas na mesma ordem.

eu fiz o que tu me mandou mais ainda chama todos os labels da classe pergunta. Nao seria necessario fazer alguma alteração na classe nao??
vlw pelas respostas! :slight_smile:

public class Perguntas  {

	JLabel lab,lab2,lab3,lab4;
	
	
	Perguntas pergunta1(){
		Fase1.pergunta1.setVisible(false);
		Fase1.rad12.setVisible(false);
		Fase1.rad13.setVisible(false);
		Fase1.ok.setVisible(false);
		Fase1.rad11.setVisible(false);
	   lab = new JLabel("LAB0");
	   lab.setBounds(15,100,180,20);
	   Fase1.perg.add(lab);
	return null;
	}
	
	Perguntas  pergunta2(){
		Fase1.pergunta1.setVisible(false);
		Fase1.rad12.setVisible(false);
		Fase1.rad13.setVisible(false);
		Fase1.ok.setVisible(false);
		Fase1.rad11.setVisible(false);
		   lab2 = new JLabel("LAB1");
		   lab2.setBounds(15,150,180,20);
		   Fase1.perg.add(lab2);
		   return null;
		}
	
	Perguntas pergunta3(){
		Fase1.pergunta1.setVisible(false);
		Fase1.rad12.setVisible(false);
		Fase1.rad13.setVisible(false);
		Fase1.ok.setVisible(false);
		Fase1.rad11.setVisible(false);
		   lab3 = new JLabel("LAB2");
		   lab3.setBounds(15,200,180,20);
		  Fase1.perg.add(lab3);
		  return null;
		}
	
	Perguntas pergunta4(){
		Fase1.pergunta1.setVisible(false);
		Fase1.rad12.setVisible(false);
		Fase1.rad13.setVisible(false);
		Fase1.ok.setVisible(false);
		Fase1.rad11.setVisible(false);
		   lab4 = new JLabel("LAB3");
		   lab4.setBounds(15,250,180,20);
		   Fase1.perg.add(lab4);
		   return null;
		}
	
}

Quantas perguntas você quer sortear?
Com o shuffle, não é necessário usar o random. Ele já embaralha a lista de perguntas para você.

Para uma pergunta só, basta pegar a primeira pergunta após o shuffle.

só quero sortear uma. seu retirar o random o for continua neh?

Então fica assim:

Random op = new Random(); po.get(op.nextInt(4));

Sem for.

fiz mas mesmo assim continua chamando os labels. vlw pela força!