No entiendo bien tu pregunta, ¿Quieres generar objetos aleatoriamente o quieres a partir de una lista de objetos elegir dos objetos aleatorios?
Sea como sea, no es difícil. Con la clase
java.util.Random como te dijo engelx lo puedes conseguir. Te ejo un ejemplo:
package pe.edu.unp.rol;
public abstract class Jugador {
public Jugador() {
this("",0d,0);
}
this.nombre = nombre;
this.poder = poder;
this.vida = vida;
}
return this.nombre;
}
public void setNombre
(String nombre
) { this.nombre = nombre;
}
return this.poder;
}
public void setPoder
(Double poder
) { this.poder = poder;
}
return vida;
}
public void setVida
(Integer vida
) { this.vida = vida;
}
}
package pe.edu.unp.rol;
public class Soldado extends Jugador {
public Soldado() {
super();
}
super(nombre,poder,vida);
}
}
package pe.edu.unp.rol;
public class Campesino extends Jugador {
public Campesino() {
super();
}
super(nombre,poder,vida);
}
}
package pe.edu.unp.rol;
public class Mago extends Jugador {
public Mago() {
super();
}
super(nombre,poder,vida);
this.magia = magia;
}
return magia;
}
public void setMagia
(Double magia
) { this.magia = magia;
}
}
package pe.edu.unp.rol;
public class Obrero extends Jugador {
public Obrero() {
super();
}
super(nombre,poder,vida);
}
}
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test {
private final static String paquete
= "pe.edu.unp.rol."; // nombre del paquete que contiene las clases
/**
* Este metodo genera en tiempo de ejecución instancias de 4 clases distintas, con nombres aleatorios
* y sus propiedades poder, vida y en caso la instancia sea tipo 'Mago', agrega la magia, todos aleatorios.
*
* @return List<Jugador>
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws ClassNotFoundException
*/
List<Jugador> listaObjetos = new ArrayList<>(); // lista que almacenara las instancias de las clases
String[] clases
= {"Soldado",
"Campesino",
"Mago",
"Obrero"}; String[] nombres
= {"Halz",
"Orion",
"Violetus",
"Orks",
"Kalz",
"Pivot",
"Nerth",
"Seth",
"Vandal"};
int numeroObjetosAzar
= new Random().
nextInt(50)+1; // se crearan maximo 50 instancias con los 4 tipos de clases
for(byte i=0; i<numeroObjetosAzar; i++) {
// valores aleatorios que se setearan a las instancias
String claseAleatoria
= clases
[ (1 + new Random().
nextInt(3)) ]; String nombreAleatorio
= nombres
[ (1 + new Random().
nextInt(8)) ];
/** de acuerdo a la clase, obtenemos una instancia de acuerdo a la clase que especificamos
por medio de 'Class.forName(clase)' seguido de 'getConstructor()' que obtiene el
constructor de dicha clase y le pasamos los parametros.
Esto se puede hacer perfectamente con el operador new Clase(parametros). La diferencia
es que Class.forName() se usa cuando no se sabe que clase instanciar si no hasta cuando
las circunstancias en tiempo de ejecucion lo determine. new lo usamos cuando sabemos de
antemano que clase instanciar.*/
switch(claseAleatoria) {
case "Soldado": listaObjetos.add((Soldado)Class.forName(paquete+claseAleatoria)
.
getConstructor(String.
class,
Double.
class,
Integer.
class).
newInstance(nombreAleatorio,poderAleatorio,vidaAleatoria
)); break;
case "Campesino": listaObjetos.add((Campesino)Class.forName(paquete+claseAleatoria)
.
getConstructor(String.
class,
Double.
class,
Integer.
class).
newInstance(nombreAleatorio,poderAleatorio,vidaAleatoria
)); break;
case "Mago": listaObjetos.add((Mago)Class.forName(paquete+claseAleatoria)
.
getConstructor(String.
class,
Double.
class,
Integer.
class,
Double.
class).
newInstance(nombreAleatorio,poderAleatorio,vidaAleatoria,magiaAleatoria
)); break;
default : listaObjetos.add((Obrero)Class.forName(paquete+claseAleatoria)
.
getConstructor(String.
class,
Double.
class,
Integer.
class).
newInstance(nombreAleatorio,poderAleatorio,vidaAleatoria
)); }
}
return listaObjetos;
}
public static void main
(String[] args
) { Test test = new Test();
/**
* Ejemplo de recorrido. Generalizamos con 'Jugador' porque todas sus subclases:
* Soldado, Campesino, Mago y Obrero al heredar de Jugador son tambien un Jugador.
* Recuerda que la herencia es una relacion es un. El operador 'instaceof' es util
* para saber si una objeto es de una clase dada: objeto instaceof clase. Esto
* retorna true si es el objeto es una instancia de la clase o false si no lo es.
*/
try {
for(Jugador e : test.getJugadores()) {
System.
out.
println("Tipo:\t"+e.
getClass().
getSimpleName()); System.
out.
println("Nombre:\t"+e.
getNombre()); System.
out.
println("Poder:\t"+e.
getPoder()); System.
out.
println("Vida:\t"+e.
getVida()); if(e.getClass().getSimpleName().equals("Mago")) {
Mago mago = (Mago) e;
System.
out.
println("Magia:\t"+mago.
getMagia()); }
}
e.printStackTrace();
System.
err.
println(e.
getLocalizedMessage()); }
}