Foros del Web » Programación para mayores de 30 ;) » Java »

utilizacion del random en un arraList, sin contar un elemento

Estas en el tema de utilizacion del random en un arraList, sin contar un elemento en el foro de Java en Foros del Web. Hola, el problema que tengo es sencillo. Tengo 3 elementos en un arrayList, y quiero coger cada vez un elemento al azar, aunque el tercero ...
  #1 (permalink)  
Antiguo 29/09/2010, 01:47
 
Fecha de Ingreso: mayo-2010
Mensajes: 71
Antigüedad: 13 años, 10 meses
Puntos: 1
utilizacion del random en un arraList, sin contar un elemento

Hola,

el problema que tengo es sencillo.

Tengo 3 elementos en un arrayList, y quiero coger cada vez un elemento al azar, aunque el tercero sera el que quede "por huevos" jeje

Es decir...tenemos los elementos A, B Y C.

Quiero que en el primer random me coja uno, por ejemplo, el B.
Luego el siguiente random me lo haga entre A Y C y si coje el A, pues por ultimo me quedo con el C.

Al principio me parecia un problema sencillo pero al implementarlo como veis abajo, me surgia un problema.
"Copia" es el arrayList donde tengo los elementos, que es un copia del arraylist original "persona". Lo hago para poder manipular ese arrayList sin problemas.

Código:
Random rand = new Random();
int x = rand.nextInt(copia.size());
copia.remove(x);
int y = rand.nextInt(copia.size());
copia.remove(y);
int z = rand.nextInt(copia.size());

String uno_Nombre = persona.get(x).getNombre();
String dos_Nombre = persona.get(y).getNombre();
String tres_Nombre = persona.get(z).getNombre();
Claro, yo pensaba que con el remove, quitaba ese elemento, y si lo quito, pero el resto de desplaza hacia la izquierda. Es decir, si los elementos son A,B Y C.
En int x la primera vez me sale un 1(el tamaño de copia es 3, de 0 a 2). Ese 1 corresponde a B y cuando el get(x).getNombre(); me coge el B sin problemas.

Pero luego lo borro y el arraylist queda a pasar a A(posicion 0) y C(posicion 1) con lo cual, es muy probable que en int y, me salga otra vez el 1(50% de probabilidad). Y claro, al hacer get(y).getnombre(); pues me coge lo mismo que el get(x).

Como puedo hacer que el segundo random sea solo entre la posicion 0, y la 2, sin contar el que ya a sido seleccionado?
  #2 (permalink)  
Antiguo 30/09/2010, 14:23
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: utilizacion del random en un arraList, sin contar un elemento

Hola Peter:

No se si esto lo quieres hacer sólo para tres valores o para más.

Se me ocurre por ejemplo que cuando generas el valor aleatorio, lo que puedes hacer es que si sale el valor que no quieres que salga (por ejemplo el 3), lo que haces es volver a generar otro valor random.

Yo no borraría del array los valores para que sea más sencillo. Y si quieres usaría otro array alternativo con 0 y 1 para determinar si ese valor ya ha salido. Creamos este array del mismo tamaño que el de personas. Si no conocemos su tamaño, podríamos recurrir a un arraylist.

Algo así:

Código:
int [] cogidos = new int [20];
for (int i = 0; i < 20; i++)
{
   codigos[i] = 0;
}

//Si el valor que no quiero que salga es el 5 hago esto
codigos[5] = 1;

Random rand = new Random();
int contador = 0;
while (contador < 20)
{
     int valor = rand.nextInt(20);
     if (cogidos[valor] == 0)
     {
           cogidos[valor] == 1;
           System.out.println("El valor es : " + persona.get(valor).getNombre();
           contador++;
      }
}

//Y al final hago
System.out.println("El valor es : " + persona.get(5).getNombre();
Espero que esto te sirva.

Saludos.

Filemute
  #3 (permalink)  
Antiguo 01/10/2010, 03:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 71
Antigüedad: 13 años, 10 meses
Puntos: 1
Respuesta: utilizacion del random en un arraList, sin contar un elemento

Gracias filemute, no se me habia ocurrido.
Al final he conseguido solucionarlo asi.

Código:
Random rand = new Random();
int x = rand.nextInt(copia.size());
String uno_Nombre = copia.get(x).getNombre();
copia.remove(x);
int y = rand.nextInt(copia.size());
String dos_Nombre = copia.get(y).getNombre();
copia.remove(y);
int z = rand.nextInt(copia.size());
String tres_Nombre = copia.get(z).getNombre();
Lo que hago es coger el nombre del elemento antes de borrarlo, y el get lo hago sobre copia, en cuyo arrayList ya no esta el primer elemento. Asi si en "y" me sale otra vez el 1, ya no cogera el mismo que antes, sino el que se ha desplaza hacia la izquierda.

Gracias de todas formas!

Etiquetas: contar, random, utilizacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:02.