en el segundo, sinceramente llevo varios días y a un no logro hallar la manera de como hacer que el random no genere números repetidos. Agradecería algo de apoyo.
Una forma que se me ocurre, usando los elementos básicos disponibles a este nivel (con
Clases y
Programacion Orientada Objetos podría ser más fácil), es la siguiente:
Sería recorrer el arreglo/vector/array (como queramos llamarlo...) y por cada una de sus posiciones, generar un numero random.
Antes de aceptarlo, volver a recorrer de nuevo el vector y comprobar si el numero random ya existe en el o no.
Si no existe, lo aceptamos y pasamos a la siguiente posicion.
Si existe, entonces lo descartamos, volvemos a generar otro y repetimos la misma comprobacion.. así hasta que se genere un numero que no exista.
Entonces, para hacer esto, se necesitaría tres bucles anidados:
Primero, un bucle
for que recorra las posiciones del vector, una a una...
Segundo, un bucle
do...while donde se generarán números random
mientras dichos números estén siendo descartados. Solo se detendrá cuando el número random haya sido aceptado.
Tercero, otro bucle
for (uso un
for each en este caso) que recorre todo el vector y comprueba si el numero random existe o no.
Si existe, indicaremos al bucle
while que el número ha sido descartado para que siga repitiendose.
Si no existe, lo aceptamos y le indicaremos al
while que ya puede terminar.
Esto se lo comunicaremos con una variable booleana, que yo he llamado
descartadoTe adjunto un programa donde se hace esto, para que lo veas y decidas si quieres incluirlo en tu programa.
Por curiosidad, he incluido un contador de numeros descartados. Así al final del programa se muestran los números generados al azar y también se informa de cuantos números han sido descartados durante el proceso.
import java.util.Random;
public final class SinRepetir {
public static void main(String[] args) {
Random rn = new Random();
int[] numeros = new int[10];//Aqui indicamos cuantos queremos generar, 10 en este caso
boolean descartado;
int contDescartados = 0; //Por curiosidad, contaremos cuantos numeros random serán descartados
/*
* Recorreremos las posiciones del vector una a una.
* Para cada una de ellas, generaremos un numero al azar y antes de aceptarlo
* volveremos a recorrer el vector completo para comprobar si el numero generado
* ya existe en el vector.
* Si no existe, lo aceptaremos y pasaremos a la siguiente posicion.
* Si existe, es decir, está repetido, lo descartaremos y volveremos a generar otro
* hasta que aparezca uno que no exista
*/
for (int i = 0; i < numeros.length; i++)
{
do//Este bucle se repetirá hasta que salga un numero random no repetido, es decir, mientras descartado == true
{
int numeroRandom = rn.nextInt(50) + 1;//Generamos entero entre 1 y 50
descartado = false;//De momento, el numero no está descartado
//Ahora recorremos el vector completo y comprobamos si el numero generado ya existe dentro de él
for (int numVector: numeros)
{
if (numVector == numeroRandom)//EL numero generado ya existe en el vector, hay que descartarlo
{
descartado = true;//Lo descartamos
contDescartados++;//Contamos el descarte, por curiosidad...
break;//Finalizamos bucle for, no hace falta seguir comparando
}
}
//Tras comprobar si el numero estaba repetido, ahora decidimos si aceptamos el numero random generado
if (!descartado)//No ha sido descartado, lo aceptamos. El bucle do..while terminará y pasaremos al siguiente numero del vector
numeros[i] = numeroRandom;
}while (descartado);
}
//Mostramos números generados
for (int n: numeros)
System.out.print(n + " ");
System.out.println("\nSe han descartado " + contDescartados + " numeros random");
}
}