Riempimento di un array con numeri casuali non ripetitivi

di il
9 risposte

Riempimento di un array con numeri casuali non ripetitivi

Ciao ragazzi,

sto creando un progetto android, nel codice java non riesco a capire dove sbaglio.

sostanzialmente devo riempire un array con dei numeri random (es lunghezza array 10, i numeri random vanno da 1 a 10) senza però che i numeri si ripetano per più di una volta.

il problema è che nell'array vengono comunque inseriti numeri già usciti, non riesco proprio a capire deve sbaglio

questo è il codice

int[] n1 = new int[30];                       //creo array
Random gen = new Random();            //creo random
int count = 0;                                     //creo contatore

     b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
           {
                  TextView tt1 = (TextView) findViewById(R.id.t1);
                  int num1 = 0;
            
             if (count < n1.length)             //se il count(contatore) è minore della lunghezza dell'array procedo se no vado in errore
             {
                 salto:                                 // label del break
                 {
                     num1 = gen.nextInt(30) + 1;    // genero numero casuale all'interno del range

                     for (int i = 0; i < n1.length; i++)   //scorro tutto l'array
                     {
                           if (num1 == n1[i])                  //se il num casuale generato è già inserito nell'array torno indietro al salto e ne genero uno nuovo 
                                                                        //ripetendo tutto l'itere
                                {
                                 break salto;
                                }
                     }
                 }

                 n1[count] = num1;                              // se esco dal ciclo for sopra vuol dire che non era ancora uscito il numero e quindi lo aggiungo
                 count = count +1;
                 String BB = String.valueOf(num1);
                 tt1.setText(BB);
                 String CC = String.valueOf(count);
                 cont.setText(CC);
             }
              else
            {
                 cont.setText("Limite massimo");
             }




            }
        });

9 Risposte

  • Re: Riempimento di un array con numeri casuali non ripetitivi

    NEMESIS1990 ha scritto:


    il problema è che nell'array vengono comunque inseriti numeri già usciti, non riesco proprio a capire deve sbaglio
    Se il numero appena estratto lo trovi nell'array ( if (num1 == n1[i]) è true) devi RIPETERE la estrazione del numero .... non un break solo per uscire da un blocco di codice.
    Con quel tuo codice, n1[count] = num1; lo fai COMUNQUE, sia che si arrivi al break salto; oppure no.

    P.S. break salto; NON fa ripetere quel blocco !!!
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Soluzione molto piu' banale: generi il vettore ordinato e lo mescoli in modo casuale.

    Random shuffle
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Mi sa che stai fraintendendo il senso dell'istruzione break con label: non è un goto!
    L'istruzione break, da sola, serve a terminare il ciclo entro cui essa è invocata. L'esecuzione prosegue con il codice posto DOPO il ciclo.
    L'istruzione break con label permette di terminare il ciclo "etichettato" dalla label (che potrebbe essere, quindi, più esterno rispetto al ciclo in cui viene invocata) ed il codice prosegue con il codice posto DOPO il ciclo etichettato.

    Esempio: cerca un valore maggiore di 10 all'interno di un array.
    
    boolean trovato = false;
    cicloesterno:
    for (row = 0; row < arr.length; row++) {
       for (col = 0; col < arr[row].length; col++) {
          if (arr[row][col] > 10) {
             trovato = true;
             
             // Questo fa terminare il ciclo esterno SUBITO, così non serve che controlli le altre righe!
             break cicloesterno;
          }
       }
    }
    
    Se non avessi usato la label, verrebbe terminato solo il ciclo sulle colonne, riprendendo il controllo sulle righe successive.

    Ciao.
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Capisco , quindi il problema era l'utilizzo del breack in questo modo, grazie mille !!
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    If (count < n1.length)
                 {
    
                         num1 = gen.nextInt(30) + 1;
    
    
                         for (int i = 0; i < n1.length; i++) {
                             if (num1 == n1[i]) {
                                 num1 = gen.nextInt(30) + 1;
                                 i = 0;
                             }
    
                         }
    
    
                     n1[count] = num1;
    modificato in questo modo, ma il problema persiste -.-, sinceramente dovrebbe funzionare
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Io non riesco a capire dove sbaglio, se entro nell'if vuol dire che ha trovato una corrispondenza, quindi una volta entrato genero un nuovo numero casuale e azzero il contatore del for per far ricominciare il ciclo!

    Sicuramente c'è qualche cosa che ignoro, ma non riesco a capire dove
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    NEMESIS1990 ha scritto:


    Io non riesco a capire dove sbaglio, se entro nell'if vuol dire che ha trovato una corrispondenza, quindi una volta entrato genero un nuovo numero casuale e azzero il contatore del for per far ricominciare il ciclo!

    Sicuramente c'è qualche cosa che ignoro, ma non riesco a capire dove
    L'ultimo che hai scritto cioè il fatto di ri-estrarre il numero e mettere i = 0, NON è totalmente sbagliato.

    Ma non hai considerato una cosa: il i++ del for lo fa COMUNQUE! Quindi c'è lo stesso la possibilità di avere dei doppioni.
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Quindi dovrei mettere i = -1?
  • Re: Riempimento di un array con numeri casuali non ripetitivi

    Confermo, con i = -1sembra funzionare, grazie mille per l'aiuto !
Devi accedere o registrarti per scrivere nel forum
9 risposte