Lista de objetos - Aleatória

Pessoal,
preciso pegar um objeto aleatóriamente de uma List, E que toda vez que o método for acessado, me retorne um objeto contido nessa List. existe algum método para fazer isso ?
Grato

Pode fazer algo assim:

Random random = new Random(list.size());
list.get(random.nextInt());

pode nao ser a forma mais elegante, mas é uma forma.

Uma maneira simples de fazer isso.(Acho que as lists não tem nada pronto)

Pegue o resto de uma divisão de um numero randômico qualquer pelo numero de itens da lista.

ex.

List lista; //lista de elementos
int randomico = (numero randomico com Math.random ou Random)
int item = randomico % lista.size();
Object itemRandomico = list.get(item);

[quote=avsouza]Pode fazer algo assim:

Random random = new Random(list.size());
list.get(random.nextInt());

pode nao ser a forma mais elegante, mas é uma forma.[/quote]
Assim fica mais bonito. :smiley:

ouu:

        public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("str1");
		list.add("str2");
		
		int i = 1 + (int)(Math.random() * list.size());
		System.out.println(list.get(i-1));
	}

Usa um objecto da classe Random
por exemplo:




public MeuObjecto  aleatorio()
{

Random rand = new Random();

int i = rand.nextInt(list.size);
Meu_objecto=list.get(i);

return meu_objecto;

}

Obrigado a todos… utilizarei a classe Random.
T+

Caso você não queira repetir o mesmo elemento, você pode criar uma cópia já… randomizada:

public List<Tipo> getListaRandomica(List<Tipo> listaOriginal) {
  Random rng = new Random();
  List<Tipo> copiaLista = new ArrayList<Tipo>(listaOriginal);
  List<Tipo> retorno = new ArrayList<Tipo>(listaOriginal.size());

  while (! copiaLista.isEmpty())
    retorno.add(copiaLista.remove(rng.nextInt(copiaLista.size()));

  return retorno;
}

[quote=psyltrance]Pessoal,
preciso pegar um objeto aleatóriamente de uma List, E que toda vez que o método for acessado, me retorne um objeto contido nessa List. existe algum método para fazer isso ?
[/quote]

Não sei porque sempre que algo aleatorio está envolvido as respostas envolvem a classe Random.
Random é para algoritmos genericos. Para algoritmos com coleções deveremos usar os algoritmos de coleções.
não vamos reinventar a roda, certo ?

O seu problema é resolvido apenas com isto


Lista<Objecto> listaComTodos;

public Objecto getAleatoriamente(){
         Collections.shuffle(listaComTodos);
         return listaComTodos.get(0);
}

O método shuffle equivale ao algoritmo de usar Random para reordenar a lista, contudo muito mais simples de usar. Não precisamos utilizar indices nem nos preocuparmos se eles estão fora do limite da lista.

É importante sublinhar que uma solução OO é muito mais simples de ler e entender. Tudo bem usar Random em algoritmos de alta eficiencia (!?!) mas não é o caso…

Melhor ainda.
Fiquei com preguiça de olhar no javadoc das collections. :oops: :oops:

Estraho…Eu li uma vez que o correto é sempre fazer:

List<Objeto> list = new ArrayList<Objeto>();

Só que quando digito no eclipse ele nao compila, primeiro me sugere a tirar os argumentos e depois me sugere trocar List por ArrayList. Alguem sabe pq?

List<String> list = new ArrayList<String>(); 

Obrigado

qual sua versão da jdk?

Meu JDK: jdk1.6.0_24
Meu Jre: jre1.6.0_21