elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  array bidimensiona con numeros aleatorios sin repetir
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: array bidimensiona con numeros aleatorios sin repetir  (Leído 11,445 veces)
Baaz

Desconectado Desconectado

Mensajes: 4


Ver Perfil
array bidimensiona con numeros aleatorios sin repetir
« en: 9 Abril 2015, 00:07 am »

buenas, tengo un problema y queria saber si alguno me podria ayudar la cuestion es que tengo un trabajo del instituto el cual consiste en hacer un bingo tengo que crear un array de 3x9 y rellenarlo con numeros aleatorios hasta ahi todo bien:

public static void main(String[] args) {
        Random rnd = new Random();
           
        int [][] carton=new int [3][9];
       
            for (int i = 0; i < carton.length; i++) {
                for (int j = 0; j < carton.length; j++) {
                    carton[j]=rnd.nextInt(90)+1;
                }
            }


el problema es que tengo que rellenarla sin que los numeros aleatorios se repitan y no se como hacer para que no se repitan supongo que añadiendo un if y otra variable pero no se plantearlo bien agradeceria una respuesta un saludo.


En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #1 en: 9 Abril 2015, 00:59 am »

1) Por favor, antes de publicar algo, léanse un toque las reglas. Si vas a colocar código Java, utiliza las etiquetas GeSHi.

Primero, tu código está mal. La forma de llenar una matríz es la siguiente:

Código
  1. for(int row=0; row<numbers.length; row++) {
  2.    for(int col=0; col<numbers[row].length; col++) {
  3.        numbers[row][col] = generateRandomNumber();
  4.    }
  5. }

El método generateRandomNumber() que usaremos para generar los números de las cartillas es un método recursivo:

Código
  1. private Integer generateRandomNumber() {
  2.    Integer number = 1 + RANDOM_GEN.nextInt(90);
  3.    if(isRepeated(number)) {
  4.        number = generateRandomNumber();
  5.    }
  6.    return number;
  7. }

Que llama al método isRepeated que evalúa si un número ya existe dentro de la matríz:

Código
  1. private Boolean isRepeated(final Integer number) {
  2.    Boolean isRepeated = false;
  3.    for(Integer[] row : numbers) {
  4.        for(Integer col : row) {
  5.            if(col == number)
  6.                isRepeated = true;
  7.         }
  8.     }
  9.     return isRepeated;
  10. }

Luego, puedes obtener la cartilla:

Código
  1. public Integer[][] getCard() throws IllegalAccessException {
  2.    if(numbers[0][0] == null) {
  3.        throw new IllegalAccessException("Primero llene la cartilla");
  4.    }
  5.    return numbers;
  6. }

Y, el método main sería así:

Código
  1. public static void main(String[] args) {
  2.    Bingo bingo = new Bingo().generateNumbers();
  3.    try {
  4.        for(Integer[] row : bingo.getCard()) {
  5.            for(Integer col : row) {
  6.                System.out.println(col);
  7.             }
  8.         }
  9.     } catch(IllegalAccessException e) {
  10.         javax.swing.JOptionPane.showMessageDialog(null,e.getMessage());
  11.     }
  12. }

Nota que en el método getCard() lanzamos una IllegalAccessException si tratamos de obtener la cartilla y ésta está vacía. Ésta excepción la capturamos en el método main y mostramos el mensaje en un JOptionPane.

El código, quedaría así:

Código
  1. import java.util.Random;
  2.  
  3. public class Bingo {
  4.    private Integer[][] numbers = new Integer[9][3];
  5.    private final Random RANDOM_GEN = new Random(System.nanoTime());
  6.  
  7.    public Integer[][] getCard() throws IllegalAccessException {
  8.        if(numbers[0][0] == null) {
  9.            throw new IllegalAccessException("Primero llene la cartilla");
  10.        }
  11.        return numbers;
  12.    }
  13.    public Bingo generateNumbers() {
  14.        for(int row=0; row<numbers.length; row++) {
  15.            for(int col=0; col<numbers[row].length; col++) {
  16.                numbers[row][col] = generateRandomNumber();
  17.            }
  18.        }
  19.        return this;
  20.    }
  21.    private Integer generateRandomNumber() {
  22.        Integer number = 1 + RANDOM_GEN.nextInt(90);
  23.        if(isRepeated(number)) {
  24.            number = generateRandomNumber();
  25.        }
  26.        return number;
  27.    }
  28.    private Boolean isRepeated(final Integer number) {
  29.        Boolean isRepeated = false;
  30.        for(Integer[] row : numbers) {
  31.            for(Integer col : row) {
  32.                if(col == number)
  33.                    isRepeated = true;
  34.            }
  35.        }
  36.        return isRepeated;
  37.    }
  38.    public static void main(String[] args) {
  39.        Bingo bingo = new Bingo().generateNumbers();
  40.        try {
  41.            for(Integer[] row : bingo.getCard()) {
  42.                for(Integer col : row) {
  43.                    System.out.println(col);
  44.                }
  45.            }
  46.        } catch(IllegalAccessException e) {
  47.            javax.swing.JOptionPane.showMessageDialog(null,e.getMessage());
  48.        }
  49.    }
  50. }


Saludos.


En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #2 en: 9 Abril 2015, 01:59 am »

Excelente respuesta! Pero voy a meterme un poco y preguntar algo.

¿Que hace exáctamente el método isRepeated()?

(Entiendo la funcionalidad, pero no veo que es lo que hace -> ¿Recorre el array bidimensional completo buscando por el numero aleatorio ya este insertado?

El problema es que no me he familiarizado completamente con la sintaxis de JAVA.



« Última modificación: 9 Abril 2015, 02:01 am por DarK_FirefoX » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #3 en: 9 Abril 2015, 02:20 am »

Hola DarK_FirefoX,

Sip, es exactamente eso. Es lo mismo que hacer:

Código
  1. for(int row=0; row<numbers.length; row++) {
  2.    for(int col=0; col<numbers[row].length; col++) {
  3.        if(numbers[row][col] == number)
  4.            isRepeated = true;
  5.    }
  6. }

Incluso se puede otpimizar un poco, para que rompa el loop principal al detectar un número repetido:

Código
  1. private Boolean isRepeated(final Integer number) {
  2.    Boolean isRepeated = false;
  3.    mainloop:
  4.    for(Integer[] row : numbers) {
  5.        for(Integer col : row) {
  6.            if(col == number) {
  7.                isRepeated = true;
  8.                break mainloop;
  9.            }
  10.        }
  11.    }
  12.    return isRepeated;
  13. }


Un saludo.
« Última modificación: 9 Abril 2015, 02:58 am por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baaz

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #4 en: 9 Abril 2015, 03:12 am »

muchas gracias gus garsaky la verdad que muchas cosas aun ni las había visto pero me gusta porque así aprendo mas recién es mi primer año de DAM (desarrollo de aplicación multiplataforma) y por eso me cuesta mucho pero muchas gracias y perdón por no haber puesto el código donde tenia que ir es que soy nuevo en el foro jeje un saludo!
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #5 en: 9 Abril 2015, 03:24 am »

No te preocupes, no pasa nada ^^. Un saludo y dale duro a la carrera.
« Última modificación: 9 Abril 2015, 03:43 am por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #6 en: 9 Abril 2015, 05:59 am »

Hola DarK_FirefoX,

Sip, es exactamente eso. Es lo mismo que hacer:

Código
  1. for(int row=0; row<numbers.length; row++) {
  2.    for(int col=0; col<numbers[row].length; col++) {
  3.        if(numbers[row][col] == number)
  4.            isRepeated = true;
  5.    }
  6. }

Incluso se puede otpimizar un poco, para que rompa el loop principal al detectar un número repetido:

Código
  1. private Boolean isRepeated(final Integer number) {
  2.    Boolean isRepeated = false;
  3.    mainloop:
  4.    for(Integer[] row : numbers) {
  5.        for(Integer col : row) {
  6.            if(col == number) {
  7.                isRepeated = true;
  8.                break mainloop;
  9.            }
  10.        }
  11.    }
  12.    return isRepeated;
  13. }


Un saludo.

Gracias, entendido. Eso era lo que pensaba.

Pero pensando, puedo sugerir hacer esa revisión (de si está repetido) dinamicamente, aunque en este caso no será perceptible (por el pequeño tamaño del array original), pero creando un array de bool con el tamaño definido por la cantidad de números posibles a poner en el array bidimensional, y una vez que se genere el número se indexa y se cambia este array a true, luego la comprobación sería solo indexar y comprobar el estado del array en esa posición. (tendría una complejidad temporal de O(1)), no se si me explico.

Salu2s
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #7 en: 9 Abril 2015, 13:49 pm »

Ya veo, algo como el algoritmo Bucket Sort. Sip, en arrays grandes puede llegar a ser más eficiente, aunque en la VM actual no lo creo. Por ejemplo, for y while tardan 234 milisegundos en recorrer un array de 15 millones, osea .234 segundos, Iterator 340. Puedes ver el benchmark aquí.

Como puedes observar, es poquísimo tiempo para tan exorbitante muestra.


Saludos.
« Última modificación: 9 Abril 2015, 13:52 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: array bidimensiona con numeros aleatorios sin repetir
« Respuesta #8 en: 9 Abril 2015, 15:02 pm »

Ya veo, algo como el algoritmo Bucket Sort. Sip, en arrays grandes puede llegar a ser más eficiente, aunque en la VM actual no lo creo. Por ejemplo, for y while tardan 234 milisegundos en recorrer un array de 15 millones, osea .234 segundos, Iterator 340. Puedes ver el benchmark aquí.

Como puedes observar, es poquísimo tiempo para tan exorbitante muestra.

Saludos.

Exacto, por eso dije que era un sugerencia a tener en cuenta para ese método, pues en este caso no es perceptible pues la entrada de datos es pequeña! Solo algo a tener en cuenta si se le quiere dar otro uso!

Salu2s
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines